首页 > 其他分享 >994. Rotting Oranges[Medium]

994. Rotting Oranges[Medium]

时间:2023-04-07 21:00:52浏览次数:33  
标签:994 Medium Rotting res ++ queue int length grid

994. Rotting Oranges

You are given an m x n grid where each cell can have one of three values:

  • 0 representing an empty cell,
  • 1 representing a fresh orange, or
  • 2 representing a rotten orange.

Every minute, any fresh orange that is 4-directionally adjacent to a rotten orange becomes rotten.

Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1.

Constraints:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10
  • grid[i][j] is 0, 1, or 2.

Example
image

Input: grid = [[2,1,1],[1,1,0],[0,1,1]]
Output: 4

思路

先遍历一边二维数组,有两个目的

  • 统计新鲜橘子数量,到最后如果还有剩余的新鲜橘子,那就说明没有全部腐烂,直接返回-1
  • 把已经腐烂的橘子放进队列中,这就是首批腐烂橘子,对应着 res -〉0

接下来就是依次取出队列中腐烂橘子,做广度遍历,只要在边界范围内并且是新鲜橘子的,就将其腐烂,然后也入队列,每一批次队列的橘子取完,那这回合的腐烂就结束了,res++

题解

    Integer freshCount = 0;

    public int orangesRotting(int[][] grid) {
        int res;
        Queue<int[]> queue = new LinkedList<>();
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 1)
                    freshCount++;
                if (grid[i][j] == 2)
                    queue.add(new int[]{i, j});
            }
        }
        res = bfs(grid, queue);
        return freshCount == 0 ? res : -1;
    }

    public int bfs(int[][] grid, Queue<int[]> queue) {
        int res = 0;
        int[][] dire = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        while (!queue.isEmpty() && freshCount != 0) {
            int size = queue.size();
            for (int j = 0; j < size; j++) {
                int[] curPos = queue.poll();
                for (int i = 0; i < dire.length; i++) {
                    int curRow = curPos[0] + dire[i][0];
                    int curCol = curPos[1] + dire[i][1];
                    if (curRow < 0 || curRow >= grid.length || curCol < 0 || curCol >= grid[0].length
                            || grid[curRow][curCol] != 1)
                        continue;
                    queue.add(new int[]{curRow, curCol});
                    grid[curRow][curCol] = 2;
                    freshCount--;
                }
            }
            res++;
        }
        return res;
    }

标签:994,Medium,Rotting,res,++,queue,int,length,grid
From: https://www.cnblogs.com/tanhaoo/p/17297313.html

相关文章

  • HDOJ1994 利息计算
    利息计算TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):6791    AcceptedSubmission(s):4634ProblemDescription为自行解决学费,chx勤工俭学收入10000元以1年定期存入银行,年利率为3.7%。利率按......
  • 1976. 到达目的地的方案数 (Medium)
    问题描述1976.到达目的地的方案数(Medium)你在一个城市里,城市由n个路口组成,路口编号为0到n-1,某些路口之间有双向道路。输入保证你可以从任意路口出发到达其......
  • 1786. 从第一个节点出发到最后一个节点的受限路径数 (Medium)
    问题描述1786.从第一个节点出发到最后一个节点的受限路径数(Medium)现有一个加权无向连通图。给你一个正整数n,表示图中有n个节点,并按从1到n给节点编号;另给你一......
  • 743. 网络延迟时间 (Medium)
    问题描述743.网络延迟时间(Medium)有n个网络节点,标记为1到n。给你一个列表times,表示信号经过有向边的传递时间。times[i]=(uᵢ,vᵢ,wᵢ),其中uᵢ是源节......
  • 1310. 子数组异或查询 (Medium)
    问题描述1310.子数组异或查询(Medium)有一个正整数数组arr,现给你一个对应的查询数组queries,其中queries[i]=[Lᵢ,Rᵢ]。对于每个查询i,请你计算从Lᵢ到Rᵢ......
  • 1599. 经营摩天轮的最大利润 (Medium)
    问题描述1599.经营摩天轮的最大利润(Medium)你正在经营一座摩天轮,该摩天轮共有4个座舱,每个座舱最多可以容纳4位游客。你可以逆时针轮转座舱,但每次轮转都需要......
  • 209. 长度最小的子数组 (Medium)
    问题描述209.长度最小的子数组(Medium)给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长度最小的连续子数组[numsₗ,num......
  • 洛谷P1213 [USACO1.4][IOI1994]时钟 The Clocks
    这是一个暴力枚举题有两种解决方法,第一种用九重for循环(有点麻烦,尽量别用),第二种简化版(虽然行数少了,但难理解),先来看看 题目!!!题目描述考虑将如此安排在一个 3*3 行......
  • 1487. 保证文件名唯一 (Medium)
    问题描述1487.保证文件名唯一(Medium)给你一个长度为n的字符串数组names。你将会在文件系统中创建n个文件夹:在第i分钟,新建名为names[i]的文件夹。由于两个......
  • 464. 我能赢吗 (Medium)
    问题描述464.我能赢吗(Medium)在"100game"这个游戏中,两名玩家轮流选择从1到10的任意整数,累计整数和,先使得累计整数和达到或超过100的玩家,即为胜者。如果我......