在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。算法
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。数组
样例
输入数组:函数
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]]code
若是输入查找数值为7,则返回true,排序
若是输入查找数值为5,则返回false。get
常规思路是直接两层循环暴搜,但时间复杂度是O(n^2)。
本题能够利用从左到右,从上到下递增的性质,从右上角的元素开始(从左下角也行),若是target比该元素小,那么该元素所在列没必要再作判断(整列都比该元素大),若是taget比该元素大,则不用再判断该元素所在行的其余元素,也就是每次都能省去判断整一列或者一行,缩小搜索区域。
时间复杂度是:O(n+m),其中n是行数,m是列数io
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; } }