二維數組中的查找


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

代碼格式要求:

public class Solution {
    public boolean Find(int target, int [][] array) {
        
    }
}

 

解題思路一:

最簡單直接當然就是雙重循環遍歷了,但是這樣的話,復雜度就變成了O(m*n),並且題目的條件完全沒有用到。

public boolean Find(int target, int [][] array) {
        if(array.length == 0){
            return false;
        }
        for(int[] row : array){
            for(int value : row){
                if(value == target) {
                    return true;
                }
            }
        }
        return false;
    }

 

解題思路二:

整個二維數組可以看成是一個有序的矩陣,我們從左下角開始遍歷,不斷利用有序性縮小矩陣的范圍,就可以找到了。

舉個例子:

1      3      5     7     9

2     4      6      8     10

4     9     12    14    16 

比如說我們現在要找8這個數

8 > 4   ,  元素右移 (此時我們可以知道4上面的元素都不是我們要找的),矩陣就變成了這樣。

    3      5     7     9

   4      6      8     10

   9     12    14    16 

 

8  <  9    元素上移 (9后面的元素全部都不再搜索范圍內了),矩陣再次變換。

1      3      5     7      9

    4      6      8     10

4     9     12    14    16 

就這樣不斷縮小整個矩陣的范圍我們就可以找到相應的元素了,當然也有可能找不到,需要自己設置邊界條件

 

完整代碼如下:

public class Solution {
    public boolean Find(int target, int [][] array) {
        if(array.length == 0){
            return false;
        }
        int rowLength = array.length;   //總行數
        int columnsLength = array[0].length;   //總列數
        
        int curRow = rowLength - 1; //當前行,初始值為最后一行
        int curColumns = 0;  //當前列
        
        while(curRow >= 0 && curColumns < columnsLength) {
            if(target == array[curRow][curColumns]) { return true;}
            else if( target > array[curRow][curColumns]) {
                curColumns ++;  //右移
            } else{
                curRow --;  //上移
            }
        }
        return false;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM