日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 994 腐烂的橘子

發布時間:2023/12/29 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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];// copyfor (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {temp[i][j] = grid[i][j];}}// rottingfor (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) {//存四個方向坐標,省的整四個if導致重復代碼多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 腐烂的橘子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。