Free Talk
刚刚做到了 寻找重复数 , 发现自己对 二分查找 还不是很熟悉,打算再做几题训练一下。
Finished Problem
搜索二维矩阵 II
240. 搜索二维矩阵 II
奇妙解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class Solution { public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length == 0) return false;
int m = matrix.length; int n = matrix[0].length;
int i = 0; int j = n - 1;
while(i < m && j >= 0){ if(matrix[i][j] > target){ j-- ; }else if(matrix[i][j] < target){ i++ ; }else{ return true; } }
return false;
} }
|
执行结果
最长上升子序列
300. 最长上升子序列
动态规划
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public int lengthOfLIS(int[] nums) {
if(nums.length == 0) return 0;
int[] dp = new int[nums.length]; Arrays.fill(dp, 1); int res = 0;
for(int i = 0; i < nums.length ; i ++ ){ for(int j = 0; j < i; j ++ ){ if(nums[j] < nums[i]) dp[i] = Math.max(dp[i], dp[j] + 1); } res = Math.max(dp[i], res); }
return res; } }
|
执行结果
动态规划+二分查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public int lengthOfLIS(int[] nums) {
if(nums.length == 0) return 0;
int[] tails = new int[nums.length]; int res = 0; for(int num : nums){ int i = 0, j = res; while(i < j){ int m = (i + j) / 2; if(num > tails[m]) i = m + 1; else j = m; } tails[i] = num; if(j == res) res++; }
return res; } }
|
执行结果
完结撒花