在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。算法
請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。數組
樣例
輸入數組:函數
[
[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; } }