文章目录
LeetCode?启动!!!
好久没写每日一题题解了,今天重新起航
干一件事情,永远不会太迟,只要现在开始,做什么都不算晚
题目:找出不同元素数目差数组
题目链接:994. 腐烂的橘子
题目描述
代码与解题思路
思路如标题,这道题是一道经典的多源 BFS 题目
go
func orangesRotting(grid [][]int) int {
var dx = []int{0, 1, -1, 0}
var dy = []int{1, 0, 0, -1}
n, m := len(grid), len(grid[0])
q := [][]int{}
// 把第一轮需要 bfs 的节点找出
for i := range grid {
for j, v := range grid[i] {
if v == 2 {
q = append(q, []int{i, j})
}
}
}
ans := 0
for len(q) > 0 {
// 进行一轮 bfs
for sz := len(q); sz > 0; sz-- {
t := q[0]
q = q[1:]
for i := 0; i < 4; i++ {
x, y := dx[i]+t[0], dy[i]+t[1]
if x < 0 || x >= n || y < 0 || y >= m || grid[x][y] != 1 {
continue
}
grid[x][y] = 2
q = append(q, []int{x, y})
}
}
if len(q) > 0 {
ans++
}
}
// 如果还有新鲜的橘子, 则返回 -1
for i := range grid {
for _, v := range grid[i] {
if v == 1 {
return -1
}
}
}
return ans
}
这是经典的多源 bfs 解题模板,我的解法,不过,最后再遍历一次判断是否还有新鲜橘子的操作可能略有些丑陋
可以看看灵神的判断方式,通过 fresh 变量的计数判断:
go
type pair struct{ x, y int }
var directions = []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} // 四方向
func orangesRotting(grid [][]int) int {
m, n := len(grid), len(grid[0])
fresh := 0
q := []pair{}
for i, row := range grid {
for j, x := range row {
if x == 1 {
fresh++ // 统计新鲜橘子个数
} else if x == 2 {
q = append(q, pair{i, j}) // 一开始就腐烂的橘子
}
}
}
ans := -1
for len(q) > 0 {
ans++ // 经过一分钟
tmp := q
q = []pair{}
for _, p := range tmp { // 已经腐烂的橘子
for _, d := range directions { // 四方向
i, j := p.x+d.x, p.y+d.y
if 0 <= i && i < m && 0 <= j && j < n && grid[i][j] == 1 { // 新鲜橘子
fresh--
grid[i][j] = 2 // 变成腐烂橘子
q = append(q, pair{i, j})
}
}
}
}
if fresh > 0 {
return -1
}
return max(ans, 0)
}
每天进步一点点
可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。