【hot100】994腐烂的橘子

一、思路

1.暂时没看官方题解,采用了一种比较笨的方法,就是每次循环都判定一下是否有节点上下左右范围内有腐烂节点的,如果有则进行一轮腐蚀,最终停止后再用另一个检查函数来检查整个图中是否有新鲜节点。
2.其中腐蚀过程中需要采用辅助数组,避免多次传递腐蚀,然后腐蚀判定的时候记得加上边界判定,越界了则不执行腐蚀。(i>0 && grid[i - 1][j] == 1)由于且需要同时成立,所以如果不满足前面的边界条件就不会向后执行也就不会报越界错误,这样写可以简化代码。

二、记忆

1.图中的边界判定

2.图中辅助数组的使用

三、代码

public int orangesRotting(int[][] grid){
        int epoch = 0;
        while(!check(grid)){
            epoch++;
            rotting(grid);
        }
        if (!checkflash(grid))return -1;
        return epoch;
    }

    public void rotting(int[][] grid) {
        int r = grid.length;
        int c = grid[0].length;
        int[][] temp = new int[r][c];//辅助数组,记录被腐烂的橘子
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (grid[i][j] == 2) {
                    if (i>0 && grid[i - 1][j] == 1) {//上
                        temp[i - 1][j] = 2;
                    }
                    if (i!=r-1 && grid[i + 1][j] == 1) {//下
                        temp[i + 1][j] = 2;
                    }
                    if (j>0 && grid[i][j-1] == 1) {//左
                        temp[i][j-1] = 2;
                    }
                    if (j!=c-1 &&grid[i][j+1] == 1) {//右
                        temp[i][j+1] = 2;
                    }
                }
            }
        }

        for (int i = 0; i < r; i++) {//修改原数组
            for (int j = 0; j < c; j++) {
                if (temp[i][j]==2){
                    grid[i][j]=2;
                }
            }
        }

    }
    public boolean check(int[][] grid){
        int r = grid.length;
        int c = grid[0].length;
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (grid[i][j]==1){
                    if ((i==0 || grid[i-1][j]!=2 )
                            && ( i==r-1 ||grid[i+1][j]!=2)
                            && (j==0 ||grid[i][j-1]!=2 )
                            && (j== c-1 || grid[i][j+1]!=2)){//周围没有腐烂节点

                    }else {
                        return false;
                    }
                }
            }
        }
        return true;
    }
    public boolean checkflash(int[][] grid){
        int r = grid.length;
        int c = grid[0].length;
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (grid[i][j]==1){
                    return false;
                }
            }
        }
        return true;
    }

你可能感兴趣的:(HOT100,java,算法,数据结构)