題目描述:
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
解題思路:
很明顯,由於該二維數組上到下遞增,左到右遞增的特殊性,遍歷整個矩陣進行查找不是該題目的意圖所在。總結規律我們可以發現:應該從矩陣的右上角或者左下角開始查找。
以右上角為例,首先選取右上角的數字,如果該數字等於要查找的數字,則查找過程結束;如果該數字大於要查找的數字,則說明該列其他元素都大於要查找的數字,便可以刪掉該列;如果該數字小於要查找的數字,則說明該行其他元素也都小於要查找的數字,便可以刪掉該行。
這樣,每一次比較都可以剔除一行或者一列,進而縮小查找范圍,時間復雜度為O(n)。
舉例:
比如在下面的二維數組中查找數字7,查找過程如下:

編程實現(Java):
public class Solution {
public boolean Find(int target, int [][] array) {
/*
思路:從左下角(或者右上角)開始查找,因為該行右邊大於它,上邊小於它,每次比較可以刪除某一行或者某一列
注意:左上和右下不可以,因為無法減小問題規模(行和列都無法刪除)
*/
if(array==null)
return false;
int row=array.length; //行數
int col=array[0].length; //列數
for(int i=row-1,j=0;i>=0&&j<col;){ //從左下角開始查找
if(array[i][j]==target) //找到
return true;
else if(array[i][j]>target) //不可能在該行,跳過該行
i--;
else //不可能在該列,跳過該列
j++;
}
return false;
}
}