題目
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
解題思路
這題乍一看還是聽費勁的,而且根本沒給測試用例,這可咋驗證對錯?既然題里沒給,那就自己寫個簡單的測試用例吧:
我是這么做的,創建一個5x5的二維數組,并且按照題目要求簡單的添加上數字。我是輸出5x5個0,然后先按行賦值,然后再給每列重新賦值。輸出是這個樣:
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
然后就可以思考這題了。我們觀察上面的輸出:
左下角和右上角是個好地方,都可以作為開始。拿左下角來說:如果target小于左下角的5,則向上移動,如果大于左下角的5,則向右移動。這樣循環下去,走完了還沒找到那應該是真找不到了。。。
具體的解法寫在了代碼中:
完整代碼
/**
* Created by AceCream on 2017/3/22.
* 在一個二維數組中,每一行都按照從左到右遞增的順序排序,
* 每一列都按照從上到下遞增的順序排序。請完成一個函數,
* 輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
*/
public class Test{
public boolean Find(int target, int [][] array) {
//顯示二維數組:
// for (int i=0;i<array.length;i++){
// for (int j=0;j<array.length;j++){
// System.out.print(array[i][j]+" ");
// }
// System.out.println();
// }
int len = array.length-1;
int wid = 0;
while (len>=0 && wid<array[0].length){
if (array[len][wid]>target){
len--;
}else if (array[len][wid]<target){
wid++;
}else {
return true;
}
}
return false;
}
public static void main(String[] args) {
int temp = 99;
int[][] a = new int[5][5];
for (int i=0;i<a.length;i++){
for (int j=0;j<a.length;j++){
a[i][j]=j+1;
}
for (int k=0;k<a[0].length;k++){
a[i][k] = i+k+1;
}
}
Test test = new Test();
System.out.println(test.Find(temp,a));
}
}