3.二维数组中的查找 ----《剑指Offer》题解(Java)
题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
样例
输入数组:
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
如果输入查找数值为7,则返回true,
如果输入查找数值为5,则返回false。
算法思路
常规思路是直接两层循环暴搜,但时间复杂度是O(n^2)。
本题可以利用从左到右,从上到下递增的性质,从右上角的元素开始(从左下角也行),如果target比该元素小,那么该元素所在列不必再做判断(整列都比该元素大),如果taget比该元素大,则不用再判断该元素所在行的其他元素,也就是每次都能省去判断整一列或者一行,缩小搜索区域。
时间复杂度是:O(n+m),其中n是行数,m是列数
代码实现
class Solution {
public boolean searchArray(int[][] array, int target) {
if(array == null || array.length == 0) {
return false;
}
if(array[0] == null || array[0].length == 0) {
return false;
}
int row = array.length, col = array[0].length;
int rIdx = 0, cIdx = col - 1;
while(rIdx < row && cIdx >= 0) {
int num = array[rIdx][cIdx];
if(num == target) return true;
if(num > target) cIdx--;
else rIdx++;
}
return false;
}
}