题994、腐烂的橘子

一、题目1

在这里插入图片描述

二、思路

代码的思路就是从每一个腐烂的苹果开始,向四周扩散,每分钟扩散一周,直到将能够感染的苹果都感染完,计算一共用来多长时间,如果已经没有好苹果了,这就是总用时,如果仍然存在完好的苹果则不能将所有的苹果感染,返回-1。

还有一种思路,我没有成功实现,但是应该可以实现,就是从每一个完好的苹果出发,去查找距离他最近的腐烂的苹果的距离,然后所有完好苹果距离的最大值就是总用时。

三、代码

import java.util.ArrayList;
import java.util.List;

public class T0994 {

    public T0994(){

//        int[][] gird = {{2,1,1},{1,1,0},{0,1,1}};
//        int[][] gird = {{2,1,1},{0,1,1},{1,0,1}};
//        int[][] gird = {{0,2}};
//        int[][] gird = {{0}};
        int[][] gird = {{0, 0, 0 }, {0, 1, 2}, { 2, 2, 2}};
        System.out.println( orangesRotting(gird) );
    }

    public int orangesRotting(int[][] grid) {

        //判断是否已经将可以感染的苹果都感染完
        boolean stop = false;

        //计算进行了几轮感染
        int count = 0;

        //暂时存储查询到的还未感染别的苹果的腐烂苹果
        List<int[]> stoke = new ArrayList<>();

        //存储当前已经感染过别的苹果的腐烂的苹果,避免重复
        int[][] map = new int[grid.length][grid[0].length];

        //一直循环,直到把所有能够感染的苹果都给感染完
        while ( !stop ){
            stop = true;

            //循环查询所有还未感染过别的苹果的腐烂苹果
            for ( int i = 0; i < grid.length; i++ ){
                for ( int j = 0; j < grid[i].length; j++ ){

                    //如果还未感染过别的苹果就将其存储在stock内
                    if (grid[i][j]==2 && map[i][j] != 1){
                        stoke.add( new int[]{i,j} );
                        map[i][j] = 1;
                    //如果还存在尚未感染的苹果就证明可能还需要继续进行循环
                    }else if ( grid[i][j] == 1 ){
                        stop = false;
                    }
                }
            }

            //将次数加一
            count++;

            //如果stock为空,证明已经没有可以去感染别的苹果的腐烂苹果了,结束循环
            if ( stoke.isEmpty() )
                break;

            //将上面查询到的腐烂苹果周围的苹果感染
            for (int[] i :stoke){

//                System.out.print(i[0] + "\t " + i[1] + "\t  ||");

                //上面
                if ( i[0] < grid.length-1 )
                    grid[i[0]+1][i[1]] = grid[i[0]+1][i[1]] == 0 ? 0 : 2;

                //下面
                if ( i[0] > 0 )
                    grid[i[0]-1][i[1]] = grid[i[0]-1][i[1]] == 0 ? 0 : 2;

                //左侧
                if ( i[1] < grid[0].length-1 )
                    grid[i[0]][i[1]+1] = grid[i[0]][i[1]+1] == 0 ? 0 : 2;

                //右侧
                if ( i[1] > 0 )
                    grid[i[0]][i[1]-1] = grid[i[0]][i[1]-1] == 0 ? 0 : 2;
            }

//            System.out.println( stoke );

            //清空stock进行下一轮循环
            stoke.clear();
        }


        //如果将所有能感染的苹果都感染过了
        //但是仍然存在尚未感染的苹果,证明不能把所有的苹果都感染,返回-1
        //否则返回count-1,因为计数的时候多算了一次,要减去
        if ( stop ){
            return count-1;
        }else
            return -1;
    }

    public static void main(String[] args) {
        T0994 t0994 = new T0994();
    }
}


  1. 来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/rotting-oranges
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值