Files
2026-07-02 13:48:46 +08:00

131 lines
2.5 KiB
Go

package top100liked
import (
"fmt"
"testing"
)
// https://leetcode.cn/problems/rotting-oranges/?envType=study-plan-v2&envId=top-100-liked
type point struct {
Row int
Col int
}
// AC,成绩不错,但是写的比较复杂
// func getFreshOrangesAround(grid [][]int, p point) []point {
// m, n := len(grid), len(grid[0])
// r, c := p.Row, p.Col
// res := []point{}
// if r > 0 && grid[r-1][c] == 1 {
// res = append(res, point{r - 1, c})
// }
// if r < m-1 && grid[r+1][c] == 1 {
// res = append(res, point{r + 1, c})
// }
// if c > 0 && grid[r][c-1] == 1 {
// res = append(res, point{r, c - 1})
// }
// if c < n-1 && grid[r][c+1] == 1 {
// res = append(res, point{r, c + 1})
// }
// return res
// }
// func orangesRotting(grid [][]int) int {
// m := len(grid)
// n := len(grid[0])
// queue := []point{}
// minutes := 0
// for row := range m {
// for col := range n {
// if grid[row][col] == 2 {
// queue = append(queue, point{row, col})
// minutes = -1
// }
// }
// }
// for len(queue) > 0 {
// batch := []point{}
// for len(queue) > 0 {
// cur := queue[0]
// queue = queue[1:]
// freshOranges := getFreshOrangesAround(grid, cur)
// for _, p := range freshOranges {
// grid[p.Row][p.Col] = 2
// }
// batch = append(batch, freshOranges...)
// }
// minutes++
// queue = batch
// }
// for row := range m {
// for col := range n {
// if grid[row][col] == 1 {
// return -1
// }
// }
// }
// return minutes
// }
func orangesRotting(grid [][]int) int {
m, n := len(grid), len(grid[0])
queue := []point{}
fresh := 0
for r := range m {
for c := range n {
switch grid[r][c] {
case 2:
queue = append(queue, point{r, c})
case 1:
fresh++
}
}
}
if fresh == 0 {
return 0
}
minutes := -1
dirs := []point{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
for len(queue) > 0 {
size := len(queue)
for range size {
cur := queue[0]
queue = queue[1:]
for _, d := range dirs {
nr, nc := cur.Row+d.Row, cur.Col+d.Col
if nr >= 0 && nr < m && nc >= 0 && nc < n && grid[nr][nc] == 1 {
grid[nr][nc] = 2
fresh--
queue = append(queue, point{nr, nc})
}
}
}
minutes++
}
if fresh > 0 {
return -1
}
return minutes
}
func Test1(t *testing.T) {
input := [][]int{{2, 1, 1}, {1, 1, 0}, {0, 1, 1}}
fmt.Println(orangesRotting(input))
}
func Test2(t *testing.T) {
input := [][]int{{2, 1, 1}, {0, 1, 1}, {1, 0, 1}}
fmt.Println(orangesRotting(input))
}
func Test3(t *testing.T) {
input := [][]int{{0, 2}}
fmt.Println(orangesRotting(input))
}