题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:矩阵是有序的,左下,向右依次递增,[m][n]
1. 可以从右上角开始找,只要小于,那么这一列都不满足,复杂度O(m + n)。
2. 每一行都是递增的,那么显然可以用二分查找,(优化:只要target< arr[i][mid],那么以后就不用考虑mid以后的列)
复杂度O(mlgn) ,当m << n ,二分比较好。
class Solution { public boolean Find(int target, int [][] array) { int row = 0; int col = array[0].length; while(row <= array.length-1 && col >= 0){ if(target == array[row][col]){ return true; }else if(target > array[row][col]){ row++; }else{ col--; } } return false; } public boolean Find(int target, int [][] array) { int row = 0; int col = array[0].length - 1; for(; row <= array.length - 1 && col >= 0; ){ if(target == array[row][col]){ return true; }else if(target > array[row][col]){ row ++; }else { col --; } } return false; } public boolean Find(int target, int [][] array){ for(int i = 0; i < array.length; i ++){ int low = 0; int high = array[i].length - 1; while(low <= high){ int mid = low + (high - low)/2; if(target > array[i][mid]){ low = mid + 1; }else if(target < array[i][mid]){ high = mid - 1; }else { return true; } } } return false; } }
本题注意点:
- 不要每次一循环都用for循环,这里行,列满足一定条件都可以了。
- 二维数组的arr行列长度,行 arr.length 列 arr[0].length。
- 二分查找不是很熟练写出来