劍指offer-二維數組中的查找

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

適用數組res來標記一行中,是否不可能。使用了一個遞歸。

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

        int row_len = array.length;
        System.out.println(row_len);


        int col_len = array[0].length;
        if(row_len*col_len ==0){
            return false;
        }


        int[][] res =new int[row_len][2];//記錄頭和尾巴
        //初始化
        for(int i =0;i<row_len;i++){
            res[i][0]=-1;
            res[i][1]=col_len;
        }
        return search(res,array,row_len,col_len,target,row_len/2,col_len/2);
    }

    public static boolean search(int[][] res,int[][] array,int row_len,int col_len,int target,int i,int j){

        if(array[i][j] > target){
            //更新res中的范圍
            biggerThanTarget(res,row_len,i,j);
            //先左邊,再上邊
            if(isOk(res,row_len,i,j-1)){
                if( search(res,array,row_len,col_len,target,i,j-1))
                    return true;
            }
            if(isOk(res,row_len,i-1,j)){
                if( search(res,array,row_len,col_len,target,i-1,j))
                    return true;
            }
        }else if(array[i][j] < target){
            smallerThanTarget(res, i, j);
            //先右邊,再下邊
            if(isOk(res,row_len,i,j+1)){
                if( search(res,array,row_len,col_len,target,i,j+1))
                    return true;
            }
            if(isOk(res,row_len,i+1,j)){
                if( search(res,array,row_len,col_len,target,i+1,j))
                    return true;
            }
        }else{
            return true;
        }
        return false;
    }

    public static boolean isOk(int[][] res,int row_len,int i,int j){
        if(i==-1 || i==row_len){
            return false;
        }
        return res[i][0] < j && res[i][1]>j;
    }

    public static void biggerThanTarget(int[][] res,int row_len,int i,int j){
        for(int k=i; k <row_len;k++){
            if( j < res[k][1]){
                res[k][1] = j;
            }
        }
    }

    public static void smallerThanTarget(int[][] res,int i,int j){
        for(int k=i; k >= 0;k--){
            if( j > res[k][0] ){
                res[k][0] = j;
            }
        }
    }
}

public class Solution {
    public boolean Find(int [][] array,int target) {
        boolean found = false;
        int lie = array[0].length;
        int hang = array.length;   
        int column = lie -1;
        int row =0;
        while(row<hang &&column>=0){
           int value = array[row][column];
            if(target>value){
                row++;
            }else if(value>target){
                column--;
            }else{
                found = true;
                break;
            }
                  
    }
        return found;
}
}

看了別人的思路,覺得自己是個智障...

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容