劍指offer 動畫圖解 | 二維數組中的查找

題目描述

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

分析

根據題目描述,我們的二維數組長這樣:

在這裏插入圖片描述

仔細觀察這個數組可以發現,左下的元素 (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 爲列數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章