1. 程式人生 > 其它 >240.搜尋二維矩陣II

240.搜尋二維矩陣II

從左下角位置開始搜尋

時間複雜度:O(行數+列數)。
想法有點像二分法,大了往一個方向找,小了往另一個方向找。由於矩陣橫向和縱向都是遞增,如果從(0,0)位置開始找,往右和往下都是增大,因此不知道實際上要往哪個方向找。但是如果以左下角位置為搜尋起點,則向右是遞增,向上是遞減,就可以用類似二分法的方式來解決這個問題。
我們知道從矩陣的一個位置到達另一個位置都可以用若干次橫向移動和若干次縱向移動,因此我們只要保證在搜尋的過程中橫移和縱移一個是增大一個是減小即可,因此從左下角和右上角開始搜尋都可以,而從左上角和右下角開始搜尋則不行。

   public boolean searchMatrix(int[][] matrix, int target) {
        int m=matrix.length,n=matrix[0].length;
        int i=m-1,j=0;
        while(i>=0&&j<n){
            if(matrix[i][j]==target) return true;
            else if(matrix[i][j]<target) j++;
            else i--;
        }
        return false;
    }

兩個方向二分

這種解法在矩陣行數和列數相差很大的時候比較有效。

   private boolean searchRow(int[][] matrix,int i,int target){
        int l=0,r=matrix[0].length-1,mid;
        while(l<=r){
            mid=(l+r)/2;
            if(matrix[i][mid]==target) return true;
            else if(matrix[i][mid]<target) l=mid+1;
            else r=mid-1;
        }
        return false;
    }
     private boolean searchColumn(int[][] matrix,int i,int target){
        int l=0,r=matrix.length-1,mid;
        while(l<=r){
            mid=(l+r)/2;
            if(matrix[mid][i]==target) return true;
            else if(matrix[mid][i]<target) l=mid+1;
            else r=mid-1;
        }
        return false;
    }
    public boolean searchMatrix(int[][] matrix, int target) {
        //如果行數小於列數,則二分搜尋的次數等於行數;反之等於列數
        for(int i=0;i<matrix.length&&i<matrix[0].length;++i){
            if(searchRow(matrix,i,target)||searchColumn(matrix,i,target)) return true;
        }
        return false;
    }