二維數組中的查找

二維數組中的查找

題目
題目:在一個二維數組中,每一行都按照從左到右的順序進行了排序,每一列都按照從上到下進行了排序。
輸入這樣的一個二維數組arr和一個整數k,判斷數組中是否存在這個數。

思路
1: 從左上角開始依次遍歷尋找,時間複雜度o(n)
2: 利用題目信息,從左到右,從上到下有序。在右上角的值在該所在的行是最大的,在所在的列是最小的,將該值與目標數對比,如果大於目標數,則直接去除該行則可以了(因爲它本身就是所在行最大的數了)。如果小於目標數,則直接去除該列。相等直接返回即可。
3: 左下角也是可以的,原理同右上角。爲啥左上和右下角不可以,因爲左上角在該行或該列都是最小的,一次比較只能排除本身,並不能直接排除整行或整列。右下角也是如此。

測試用例
1) 二維數組中包含要查找的數字(例如最大值、最小值、中間的值)
2)二維數組中不包含要查找的數字,會有如下三種情況:
2.1)要查找的值小於二維數組中的最小值
2.2)要查找的值大於二維數組中的最大值
2.3)要查找的值在二維數組的最大值與最小值之間但是不存在此值。
3)特殊輸入測試(空數組)

實現代碼

public class Solution {
    //從右上角開始排除(也可以從左下角開始)
    //因爲右上角的數是在該行是最大,列最小,可以快速去除某一行或某一列
    public boolean Find(int target, int [][] array) {
        if(array.length <= 0)
            return false;

        int rows = array.length;
        int columns = array[0].length;
        int row = 0;                        //定位到右上
        int column = columns - 1;            

        while(row < rows && column >= 0){
            if(array[row][column] == target){            //匹配到則返回true
                return true;
            }
            else if(array[row][column] > target){       //右上角的值大於目標值,則除去這一列
                column--;
            }
            else{                            //右上角的值小於目標值,則除去這一行
                row ++;
            }
        }

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