二維數組中的查找
一:題目描述
給定一個二維數組,其每一行從左到右遞增排序,從上到下也是遞增排序。給定一個數,判斷這個數是否在該二維數組中
Consider the following matrix:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
Given target = 5, return true.
Given target = 20, return false.
要求時間複雜度 O(M + N),空間複雜度 O(1)。
二:思路
由題目我們不難發現,該二維數組中的任意一個數一定大於該數的左邊的數字,一定小於下面的數字,例如數據16,一定大於9,小於17。
所以根據這個規律我們可以有以下思路:
- 從二維數組的最右上端的數據開始,也就是array[0][array[0].lenght-1];
- 當待查找數據比當前數小,則向左變移動,然後再次判斷
- 當待查數據比當前數據大,則向下移動,然後再次判斷
- 當待查數據與當前數據相同,證明找到數據。
三:代碼
/*
思路:
從二維數組的最右上端開始判斷,如果尋找數比當前數小向左移動,
再次比較,若大,向下移動,
*/
public static boolean findValue(int[][] array,int value){
//首先判斷是否符合標準
if (array == null || array.length<=0||array[0].length<=0){
return false;
}
int r = 0;
int d = array[0].length-1; //列數
//從二維數組的右上角開始判斷查找
while (r<=array.length-1&&d>=0){
//如果正好相等
if (value == array[r][d]){
return true;
}else if (value<array[r][d]){
//行數不變,列數變
d--;
}else if (value > array[r][d]){
//列數不變,行數變
r++;
}
}
return false;
}