4、二維數組中的查找

二維數組中的查找

一:題目描述

給定一個二維數組,其每一行從左到右遞增排序,從上到下也是遞增排序。給定一個數,判斷這個數是否在該二維數組中

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。
所以根據這個規律我們可以有以下思路:

  1. 從二維數組的最右上端的數據開始,也就是array[0][array[0].lenght-1];
  2. 當待查找數據比當前數小,則向左變移動,然後再次判斷
  3. 當待查數據比當前數據大,則向下移動,然後再次判斷
  4. 當待查數據與當前數據相同,證明找到數據。
    詳細過程

三:代碼

  /*
        思路:
            從二維數組的最右上端開始判斷,如果尋找數比當前數小向左移動,
            再次比較,若大,向下移動,
     */

    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;
    }

發佈了26 篇原創文章 · 獲贊 5 · 訪問量 4165
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章