題目描述
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
分析
根據題目描述,我們的二維數組長這樣:
仔細觀察這個數組可以發現,左下的元素 (4) 有一個特性,那就是右邊的元素都比它大,上面的元素都比它小。這種特殊的元素給我們提供了一個非常好的查找路徑,我們可以通過比較元素,如果當前元素比目標值小的話,我們就向右邊的路徑行走,繼續查找較大的元素,反之我們就向上的路徑行走。
算法
利用其特性,我們的算法就是從左下的元素開始,比較當前元素與目標值,如果當前元素小於目標值,我們移動到右邊的元素,再次進行比較。反之,我們移動到上方的元素,並再次進行比較。該過程將持續到我們找到目標值,或移動到數組邊界爲止。
動圖演示
Java 代碼
public class Solution {
public boolean Find(int target, int [][] array) {
int rows = array.length;
int cols = array[0].length;
// 此爲左下角元素的位置
int i = rows - 1;
int j = 0;
while (i >= 0 && j < cols) {
int value = array[i][j];
if (target == value) {
return true;
}
if (target < value) {
// 如果當前元素大於目標值,向上移動
i--;
} else {
// 如果當前元素小於目標值,向右移動
j++;
}
}
return false;
}
}
算法效率分析
從動圖中可以看出,這種算法每一次都會排除一行或者一列,那麼在最壞的情況下就是會遍歷所有的行列,因此算法的效率爲:
O (M + N)
其中 M 爲行數,N 爲列數。