1. 程式人生 > >新手算法學習之路----二分法Search-A-2D-Matrix

新手算法學習之路----二分法Search-A-2D-Matrix

不想 pre tar 二分法 個數 get || strong search

題目: 寫出一個高效的算法來搜索 m × n矩陣中的值。

這個矩陣具有以下特性:

1 每行中的整數從左到右是排序的。

2 每行的第一個數大於上一行的最後一個整數。

考慮下列矩陣:

                        [
                          [1, 3, 5, 7],
                          [10, 11, 16, 20],
                          [23, 30, 34, 50]
                         ]

給出 target = 3,返回 true

解題思路: 首先在第一列上面找到target值所在的行號,可以先找到第一個大於target的行號,那麽target值肯定在上一行(如果含有多行);然後,根據查找到的行號,在這一行上面通過二分法找到target值。

所遇問題:1,當執行到某一條語句的時候如果有return,那麽return後面的語句就不執行了。

2,matrix == null語法正確,matrix ==NULL錯誤;

3,我繞了很大的彎路,我討論了當只有一行和多行的情況下,執行二分法查找,這導致了代碼冗長,最後雖然通過了但是太長導致連我自己都不想看了,更不用說考官了。然後自己有拿別人的和自己 對比進行了精簡。其中代碼中紅色部分就是用來判斷只有一行且裏面沒有target值,體現了我考慮事情不周全。

4,還有最後的row_num = end 見註釋部分。

public boolean searchMatrix(int[][] matrix, int target) {
        
           //思想:先在第一列裏面找target值如果知道就返回true,如果沒找到就區間target值所在的區間
           //然後繼續二分法在確定這一行面找target值
           int start = 0, end = matrix.length-1;
           int mid,row_num;
           boolean
found = false; if(matrix == null||matrix.length== 0) return false; while (start<=end){ mid = start +(end-start)/2; if(matrix[mid][0]==target) { return true; }else if(matrix[mid][0]>target){ end = mid-1; }else start = mid+1; } row_num = end; //如果使用end的話,end在行20就已經減一了,就是target值所在行 if(row_num <0) return false; // 當只有一行的時候,start=end=matrix.length-1 =0 , // mid =0如果唯一的一行的第一個元素大於target的時候 end = mid -1, end <0就說明數組沒有含有target值 start = 0; end = matrix[row_num].length-1; while(start<=end){ mid = start +(end-start)/2; if(matrix[row_num][mid]==target){ return true; }else if(matrix[row_num][mid]>target) { end = mid -1; } else start = mid+1; } return false; }

新手算法學習之路----二分法Search-A-2D-Matrix