思路
这道题的思路在于使用一个队列,存储每一个腐烂的橘子的位置,每一分钟都把队列中已有的烂橘子同时开始污染周围的好橘子,把好橘子给存入队列,如果周围都已经是烂橘子了就不用继续花时间来感染了,本题类似层序遍历的写法。
注意:
- 每往队列中添加一次就说明花了一分钟时间来感染,如果后续没有往这个队列中添加那就说明没有继续花时间感染了。
- 需要注意这道题的题意,只要还有新鲜的橘子那就返回-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
}