生活随笔
收集整理的這篇文章主要介紹了
542. 01 Matrix
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
輸入:元素值為0或者1的矩陣。
輸出: 每個元素距離0的最近距離是多少。
規則:相鄰單元格的距離是1,相鄰是指上下左右4個方向。
分析:這類似于學習課程安排,可以從元素值為0的單元開始沿4個方向遍歷。matrix[i][j]=0,那么距離result[i][j]=0,而且相鄰元素的距離result[x][y]=result[i][j]+1。這樣x,y也可以加入隊列,繼續遍歷。對于已經計算好距離的元素需要標記好,防止重復計算。
進一步補充;這是一個從多個起點開始,求最短路徑的問題。我們可以假設有一個超級零節點。這個節點到任意0節點的路徑權重為0。這個超級零節點就是超級源點,這樣就把問題轉換為求從一個源點開始求最短路徑問題。參考鏈接
private int[][] pos = new int[][]{{-1,0},{1,0},{0,-1},{0,1}};public int[][] updateMatrix(int[][] matrix) {if(matrix==null || matrix.length==0) return null;int m = matrix.length;int n = matrix[0].length;int[][] result = new int[m][n];for(int i=0;i<m;i++){Arrays.fill(result[i],-1);}Queue<int[]> queue = new LinkedList<int[]>();for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(matrix[i][j]==0){result[i][j] = 0;queue.offer(new int[]{i,j});}}}while(!queue.isEmpty()){int size = queue.size();for(int i=0;i<size;i++){int[] dot = queue.poll();for(List<Integer> newPosition : newPosition(dot[0],dot[1],m,n)){int newx = newPosition.get(0);int newy = newPosition.get(1);if(result[newx][newy]==-1 || result[newx][newy] < result[dot[0]][dot[1]]+1){result[newx][newy] = result[dot[0]][dot[1]]+1;queue.offer(new int[]{newx,newy});}}}}return result;}private List<List<Integer>> newPosition(int x,int y,int m,int n){List<List<Integer>> positionList = new ArrayList<List<Integer>>();for(int i=0;i<pos.length;i++){int newx = x+pos[i][0];int newy = y+pos[i][1];if(newx>=0 && newx<m && newy>=0 && newy<n){positionList.add(Arrays.asList(newx,newy));}}return positionList;}
分析2:DP思路。如果matrix[i][j]=0,則距離為0。如果matrix[i][j]=1,并且已經知道i,j周圍所有元素的最短距離,那么 result[i][j]=min(result[i][j],min(各個方向的距離)+1)。各個方向是指上下左右。
第一次遍歷從左到右,從上到下,這樣對于i,j來講,左上的距離是確定的。
第二次遍歷從右到左,從下到上,這樣對于i,j來講,右下的距離是確定的。
需要注意的是:result[i][j]的初始化值。如果matrix[0][0]=1,那么第一次遍歷的時候,當處理到0,1元素的時候,result[0][0]=Integer.MAX_VALUE,執行Math.min(result[i][j],result[i][j-1]+1)會有Integer.MAX_VALUE+1這樣一個溢出操作,所以result[i][j]的初始化值應該是Integer.MAX_VALUE-10000。減去的數值是隨意寫的。
public int[][] updateMatrixDP(int[][] matrix) {if(matrix==null || matrix.length==0) return null;int m = matrix.length;int n = matrix[0].length;int[][] result = new int[m][n];for(int i=0;i<m;i++){Arrays.fill(result[i],Integer.MAX_VALUE-10000);}for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(matrix[i][j]==0){result[i][j]=0;}else{if(i>0){result[i][j]=Math.min(result[i][j],result[i-1][j]+1);}if(j>0){result[i][j]=Math.min(result[i][j],result[i][j-1]+1);}}}}for(int i=m-1;i>=0;i--){for (int j=n-1;j>=0;j--){if(i<m-1){result[i][j]=Math.min(result[i][j],result[i+1][j]+1);}if(j<n-1){result[i][j]=Math.min(result[i][j],result[i][j+1]+1);}}}return result;}
代碼
總結
以上是生活随笔為你收集整理的542. 01 Matrix的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。