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

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

題目

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

分析

例如這樣一個數列: 
這裡寫圖片描述 

要在裡面查詢是否存在7。按照平常的思維,只需要遍歷一遍陣列找到7返回ture,找不到返回false,這種做法當然可行。但是在時間花費和系統開銷售上來說這種做法浪費資源不可取。 
遇到這樣的問題我們首先取一個數來和7比較,首先我們取最右上方的數10來和7比較,很明顯10大於7,並且10是最右邊一列中最小的數,那麼按照規定7必然不可能存在最後一列,所以去掉一列。然後繼續看最右上角是9,9>7所以這一行也排除,然後看第二列2<7,那麼7可能在2的下邊或者是在右邊,右邊已經排除了,那麼只能在下面。所以2所在的一行不可能存在7,也剔除掉。所以要查詢的範圍就剩下三行兩列。


程式碼

public class Solution {
    public boolean Find(int target, int [][] array) {
        int rows = array.length;
        int cols = array[0].length;
        int i = 0;
        int j = cols - 1;
        while( i < rows && j  >= 0) 
        {
            if (array[i][j] > target)
            {
                j--;
                continue;
            } else if (array[i][j] < target)
            {
                i++;
                continue;
            } else
                return true;
        }
        return false;
    }
}