994. 腐烂的橘子

思路

  这道题的思路在于使用一个队列,存储每一个腐烂的橘子的位置,每一分钟都把队列中已有的烂橘子同时开始污染周围的好橘子,把好橘子给存入队列,如果周围都已经是烂橘子了就不用继续花时间来感染了,本题类似层序遍历的写法。

注意:

  • 每往队列中添加一次就说明花了一分钟时间来感染,如果后续没有往这个队列中添加那就说明没有继续花时间感染了。
  • 需要注意这道题的题意,只要还有新鲜的橘子那就返回-1,每次return的时候注意一下,这里第一次没有感染源的情况下返回,需要判断是否有新鲜橘子,如果还有那就返回-1,如果没有那就不费吹灰之力只需要0。有感染源的情况下,如果还是没办法全都感染那就返回-1,否则返回result。这个result就代表感染所需要的时间。

代码示例

func orangesRotting(grid [][]int) int {
    result:=0
    queue:=make([]*pos,0)

    flag:=false
    for i:=0;i<len(grid);i++{
        for j:=0;j<len(grid[0]);j++{
            if grid[i][j]==2{
                queue=append(queue,&pos{i:i,j:j})
            }
            if grid[i][j]==1{
                flag=true
            }
        }
    }
    if len(queue)==0{
        if flag{
            return -1
        }
        return 0
    }

    infect:=func(p *pos)[]*pos{
        result:=[]*pos{}
        i:=p.i
        j:=p.j
        
        if  i+1 <len(grid) && grid[i+1][j]==1{
            grid[i+1][j]=2
            result=append(result,&pos{i:i+1,j:j})
        }

        if  i-1 >=0 && grid[i-1][j]==1{
            grid[i-1][j]=2
            result=append(result,&pos{i:i-1,j:j})
        }

        if j+1<len(grid[0]) && grid[i][j+1]==1{
            grid[i][j+1]=2
            result=append(result,&pos{i:i,j:j+1})
        }

        if j-1>=0 && grid[i][j-1]==1{
            grid[i][j-1]=2
            result=append(result,&pos{i:i,j:j-1})
        }

        return result
    }

    for len(queue)!=0{
        n:=len(queue)
        for i:=0;i<n;i++{
            pos_s:=infect(queue[i])
            queue=append(queue,pos_s...)
        }
        queue=queue[n:]
        if len(queue)!=0{
            result++
        }
    }

    for i:=0;i<len(grid);i++{
        for j:=0;j<len(grid[0]);j++{
            if grid[i][j]==1{
                return -1
            }
        }
    }
    return result
}

type pos struct{
    i int
    j int
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值