01矩陣

在這裏插入圖片描述

01矩陣一個充滿着坑的dp問題,今天我們用dfs來解決這個問題

1.首先遍歷數組當1的左上右下四個方向沒有0時我們給它初始化一個較大的值數組的行數加列數這樣做是爲了保證在我們尋路時確保此位通過+1不能遇見0

2.我們開始遍歷這個二維數組當matrix[i][j]==1時開始遞歸邏輯

3.我們定義一個direction數組這個數組定義左上右下四個方向的移動座標

4.在遞歸函數裏開始循環direction newX=x+direction[k][0] newY=y+direction[k][1],當座標合法並且此座標的值大於等於x,y座標的值+1那麼替換newX,newY座標的值,然後繼續遞歸,這個比較就彰顯了我們將1一步不能到0初始化爲較大值的作用,這樣的替換保證了找到的路徑最小

舉個例子:

在這裏插入圖片描述

如當前數組

0到0的距離爲0不用管

當遇到第一個1時周圍有0直接遞歸函數(不滿足matrix[newX][newY]>matrix[x][y]+1)結束,不用遞歸當前位仍是1

當遇到第二個1同上

當遇到第四個1同上

第三個值不爲1當遇到的時候此值>1+1 =2將此值替換爲2

結果如下

在這裏插入圖片描述

上代碼:

class Solution {
    private int[][] direction={{0,-1},{-1,0},{0,1},{1,0}};
    public int[][] updateMatrix(int[][] matrix) {
        //將1周圍沒有0的地方初始化爲比較大的值
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[i].length;j++){
                if(matrix[i][j]==1&&!oneStep(matrix,i,j)){
                    matrix[i][j]=matrix.length+matrix[i].length;
                }
                }
            }
        //當爲1時開始尋找零
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[i].length;j++){
                if(matrix[i][j]==1){
                    dfs(matrix,i,j);
                }
            }
        }
        return matrix;
    }
    //深度優先遍歷
    public void dfs(int[][] matrix,int x,int y){
        for(int i=0;i<4;i++){
          int newX=x+direction[i][0];
          int newY=y+direction[i][1];
          if(isArea(matrix,newX,newY)&&matrix[x][y]+1<matrix[newX][newY]){
              matrix[newX][newY]=matrix[x][y]+1;
               dfs(matrix,newX,newY);
          }
        }
    }
    //1周圍沒有0的話把此位置爲較大值
    public boolean oneStep(int[][] matrix,int x,int y){
                for(int k=0;k<4;k++){
                    int newX=x+direction[k][0];
                    int newY=y+direction[k][1];
                    if(isArea(matrix,newX,newY)&&matrix[newX][newY]==0){
                        return true;
                    }
                }
        return false;
    }
    public boolean isArea(int[][] matrix,int x,int y){
        return x>=0&&y>=0&&x<matrix.length&&y<matrix[x].length;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章