【题目描述】
AcWing 15. 二维数组中的查找
【思路】
矩阵每行是单调递增的 可以 按行进行二分查找
时间复杂度为O(log m * n)
class Solution {
public boolean searchArray(int[][] array, int target) {
//[] 0
if( array == null || array.length == 0|| array[0].length == 0) return false;
int n = array.length, m = array[0].length;
for(int i =0; i < n; i ++ ){
//先按行查找:查找第一个不小于target的下标 >=target
int l = 0, r = m - 1;
while(l < r){
int mid = l + r >> 1;//[l, mid] [mid + 1, r]
if(target <= array[i][mid]){
// 谨慎修改右边界
r = mid;
}else{
l = mid + 1;
}
}
if( array[i][l] == target) return true;
}
return false;
}
}
【思路】
根据该矩阵的性质 :右上角为所在行最大, 所在列最小,依次查找。
时间复杂度为O(n + m)
class Solution {
public boolean searchArray(int[][] array, int target) {
//[] 0
if( array == null || array.length == 0|| array[0].length == 0) return false;
int n = array.length, m = array[0].length;
//根据该矩阵的性质 右上角为所在行最大 所在列最小
int i = 0, j = m - 1;
while( i < n && j >= 0){
//从右上角开始
//if( array[i][j] == target ) return true;
if( array[i][j] > target ) j --;
else if( array[i][j] < target ) i ++;
else return true;
}
return false;
}
}