題目:在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下的數序排列。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數數組
例以下面的二維數組就是每行、每列都遞增排序。若是在這個數組中查找數字7,則返回true,若是要查找5,因爲數組不含有該數字,則返回false函數
1 2 8 9測試
2 4 9 12指針
4 7 10 13排序
6 8 11 15class
當咱們須要解決一個複雜的問題的時候,一個頗有效的方法就是從一個具體的問題入手,經過分析簡單具體的例子,試圖尋找廣泛的規律。針對這個問題,咱們不妨也從一個具體的例子入手。下面咱們能夠在題目中給出的數組中查找數字7爲例來一步步分析查找的過程。test
首先咱們選取數組右上角的數字9,因爲9大於7,而且9仍是第4列的 第一個(也是最小的)數字,所以7不可能出如今數字9的所在列。因而咱們把這一列從須要考慮的區域剔除,以後只須要從分析剩下的3列。在剩下的矩陣中,位 於右上角的數字是8.一樣8大於7,所以8所在的列咱們也剔除。接下來咱們只要分析剩下的兩列便可。方法
在由剩餘的兩列組成的數組中,數字2位於數組的右上角。2小於7,那 麼要查找的7可能在2的右邊,也有可能在2的下邊。在前面的步驟中,咱們已經發現了2的右邊的列都已經被剔除了,也就是說7不可能出如今2的右邊,所以7 有可能出如今2的下邊。因而咱們把數字2所在的行也剔除,只分析剩下的三行兩列數字。在剩下的數字中,數字4位於右上角,和前面同樣,咱們把數字4所在的 行也刪除,最後剩下的兩行兩列數字。im
在剩下的兩行兩列數字4個數字中,位於右上角的恰好就是咱們要查找的數字7,因而查找就能夠結束了。總結
總結上述的查找過程,咱們發現了以下規律:首先選取數組中右上角的數 字。若是該數字等於要查找的數字,查找過程結束;若是該數字大於要查找的數字,剔除這個數字所在的列;若是該數字小於要查找的數字,剔除這個數字所在的 行。也就是說若是要查找的數字不在數組的右上角,則每一次都在數組的查找範圍中剔除一行或一列,這樣每一步均可以縮小查找的範圍,直到找到查找的數字,或 者查找範圍爲空。
如圖所示:
package cglib;
public class SingletonClass {
public static boolean find(int[][] array,int number){
if(array==null){
return false;
}
int column=array[0].length-1;//列序號從0開始,因此必須減1
int row=0;//從第一行最後一列開始的數,即右上角的數9開始
while (row<array.length && column>=0){
if(array[row][column]==number){
return true;
}
if(array[row][column]>number){//1,2,8,9,9大於7,因此必須往左移
column--;// 列數減一,表明向左移動
}else{//2小於7,因此必須往下移
row++;//行數加一,表明向下移動
}
}
return false;
}
public static void main(String args[]){
int[][] testarray=new int[4][4];
testarray[0][0]=1;
testarray[0][1]=2;
testarray[0][2]=8;
testarray[0][3]=9;
testarray[1][0]=2;
testarray[1][1]=4;
testarray[1][2]=9;
testarray[1][3]=12;
testarray[2][0]=4;
testarray[2][1]=7;
testarray[2][2]=10;
testarray[2][3]=13;
testarray[3][0]=6;
testarray[3][1]=8;
testarray[3][2]=11;
testarray[3][3]=15;
System.out.println(find(testarray, 7)); // 要查找的數在數組中
System.out.println(find(testarray, 5)); // 要查找的數不在數組中
System.out.println(find(testarray, 1)); // 要查找的數是數組中最小的數字
System.out.println(find(testarray, 15)); // 要查找的數是數組中最大的數字
System.out.println(find(testarray, 0)); // 要查找的數比數組中最小的數字還小
System.out.println(find(testarray, 16)); // 要查找的數比數組中最大的數字還大
System.out.println("空指針:"+find(null, 16)); // 健壯性測試,輸入空指針
}
}
輸出:
true false true true false false 空指針:false