生活随笔
收集整理的這篇文章主要介紹了
leetcode 994 腐烂的橘子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先給出題目:
在給定的網格中,每個單元格可以有以下三個值之一:
值 0 代表空單元格;
值 1 代表新鮮橘子;
值 2 代表腐爛的橘子。
每分鐘,任何與腐爛的橘子(在 4 個正方向上)相鄰的新鮮橘子都會腐爛。
返回直到單元格中沒有新鮮橘子為止所必須經過的最小分鐘數。如果不可能,返回 -1。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/rotting-oranges
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
給出思路:
解題首要目的,先把問題解決,不論方法。首先考慮到,直接模擬腐爛的過程,最后統計腐爛的結果。考慮以下幾種情況:一個網格里是腐爛的橘子,它只能腐化上下左右四個方向格子裝有的新鮮橘子;如果腐爛的橘子周圍沒有新鮮的橘子,則無法傳播腐化;當所有腐爛的橘子都無法傳播腐化時,結束模擬過程,開始統計結果。
下面給出代碼:
class Solution {public int orangesRotting(int[][] grid
) {int count
= 0;while (true) {if (haveNextStep(grid
)) {grid
= rotting(grid
);count
++;} else {if (isRotted(grid
)) {return count
;} else {return -1;}}}}public Boolean
haveNextStep(int[][] grid
) {int row
= grid
.length
;int col
= grid
[0].length
;for (int i
= 0; i
< row
; i
++) {for (int j
= 0; j
< col
; j
++) {if(grid
[i
][j
] == 2 ) {if (i
- 1 >= 0 && grid
[i
- 1][j
] == 1 ||i
+ 1 < row
&& grid
[i
+ 1][j
] == 1 ||j
- 1 >= 0 && grid
[i
][j
- 1] == 1||j
+ 1 < col
&& grid
[i
][j
+ 1] == 1) {return true;}}}}return false;}public Boolean
isRotted(int[][] grid
) {int row
= grid
.length
;int col
= grid
[0].length
;int fresh
= 0;for (int i
= 0; i
< row
; i
++) {for (int j
= 0; j
< col
; j
++) {if (grid
[i
][j
] == 1) {fresh
++;} }}if(fresh
> 0)return false;return true;}public int[][] rotting(int[][] grid
) {int row
= grid
.length
;int col
= grid
[0].length
;int[][] temp
= new int[row
][col
];for (int i
= 0; i
< row
; i
++) {for (int j
= 0; j
< col
; j
++) {temp
[i
][j
] = grid
[i
][j
];}}for (int i
= 0; i
< row
; i
++) {for (int j
= 0; j
< col
; j
++) {if (grid
[i
][j
] == 2) {if (i
- 1 >= 0 && grid
[i
- 1][j
] == 1) {temp
[i
- 1][j
] = 2;}if (i
+ 1 < row
&& grid
[i
+ 1][j
] == 1) {temp
[i
+ 1][j
] = 2;}if (j
- 1 >= 0 && grid
[i
][j
- 1] == 1) {temp
[i
][j
- 1] = 2;}if (j
+ 1 < col
&& grid
[i
][j
+ 1] == 1) {temp
[i
][j
+ 1] = 2;}}}}return temp
;}
}
這是能夠直接想到的方法,它解決了問題,初步到達了我們的目標。但是明顯它不夠效率,冗余代碼也較多。所以我們要思考有沒有更好的方法去解決這個問題。
算法課學的東西我都忘得差不多了,哈哈,我想不到更好的辦法了。嗯,只能借鑒一下其他人的思想了。等我徹底搞懂了再補充上來。
看了看官方的解答,感覺還是這個思路,我把代碼改了改,減少了代碼冗余度,時間復雜度并沒有降低,運行時間跟以前一樣都是4ms。
代碼如下:
class Solution {public int orangesRotting(int[][] grid
) {int[] dr
= new int[]{-1, 0, 1, 0};int[] dc
= new int[]{0, -1, 0, 1};Queue
<Integer> queue
= new ArrayDeque<Integer>();Map
<Integer,Integer> depth
= new HashMap<Integer, Integer>();int row
= grid
.length
;int col
= grid
[0].length
;for (int i
= 0; i
< row
; i
++) {for(int j
= 0; j
< col
; j
++) {if (grid
[i
][j
] == 2) {int code
= i
* col
+ j
;queue
.add(code
);depth
.put(code
, 0);}}}int rs
= 0;while(!queue
.isEmpty()) {int code
= queue
.remove();int r
= code
/ col
;int c
= code
% col
;for(int k
= 0 ; k
< 4; k
++) {int nr
= r
+ dr
[k
];int nc
= c
+ dc
[k
];if(nr
>=0 && nr
< row
&& nc
>= 0 && nc
< col
&& grid
[nr
][nc
] == 1) {grid
[nr
][nc
] = 2;int ncode
= nr
* col
+ nc
;queue
.add(ncode
);depth
.put(ncode
, depth
.get(code
) + 1);rs
= depth
.get(ncode
);}}}for (int i
= 0; i
< row
; i
++) {for (int j
= 0; j
< col
; j
++) {if (grid
[i
][j
] == 1) {return -1;} }}return rs
;}
}
總結
以上是生活随笔為你收集整理的leetcode 994 腐烂的橘子的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。