本文主要是介绍LeetCode 每日一题 ---- 【994. 腐烂的橘子】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
LeetCode 每日一题 ---- 【994. 腐烂的橘子】
- 994.腐烂的橘子
- 方法:多源BFS
994.腐烂的橘子
方法:多源BFS
昨天没吃完的橘子今天就坏掉了
可算是掉进橘子窝了
题目提到了一个腐烂掉全部橘子所需要的最小分钟,其实只需要满足从上往下每一步都尽最大可能腐烂到所有橘子就可以满足答案的最小分钟
一个多源BFS,第一步统计初始新鲜的橘子和腐烂的橘子,并将腐烂的橘子放入到队列 q 中,然后从 q 中取出腐烂的橘子,并向四个方向腐烂扩散,然后将新腐烂的橘子再放入到队列 q 中,直到 q 空,并且每次新腐烂橘子后前面维护的新鲜橘子的数量就减1,若最后新鲜橘子的数量不为0,则说明有的橘子不能被腐烂到,则返回 -1。
class Solution {private static final int[][] DIRECTIONS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int orangesRotting(int[][] grid) {int m = grid.length;int n = grid[0].length;int fresh = 0;List<int[]> q = new ArrayList<>();for (int i = 0; i < m; i ++ ) {for (int j = 0; j < n; j ++ ) {if (grid[i][j] == 1) {// 新鲜的个数fresh ++ ;} else if (grid[i][j] == 2) {// 一开始就腐烂的橘子q.add(new int[]{i, j});}}}int ans = -1;while (!q.isEmpty()) {ans ++ ;List<int[]> tmp = q;q = new ArrayList<>();for (int[] pos : tmp) {for (int[] d : DIRECTIONS) {int i = pos[0] + d[0];int j = pos[1] + d[1];if (0 <= i && i < m && 0 <= j && j < n && grid[i][j] == 1) {fresh -- ;grid[i][j] = 2;q.add(new int[]{i, j});}}}}return fresh > 0 ? -1 : Math.max(ans, 0);}
}
时间复杂度:
O(mn)
空间复杂度:
O(mn)
这篇关于LeetCode 每日一题 ---- 【994. 腐烂的橘子】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!