0x08's blog

爛橘子,情境跟內容都很有趣的題目。用到的技巧都不難但要正確的把它們組合在一起:

My Approach

const (
	empty  = 0
	fresh  = 1
	rotten = 2
)

func orangesRotting(grid [][]int) int {
	if len(grid) == 0 || len(grid[0]) == 0 {
		return -1
	}

	rows, cols := len(grid), len(grid[0])
	minute := 0
    freshCount := 0

	queue := [][2]int{}

	for r := 0; r < rows; r++ {
		for c := 0; c < cols; c++ {
			if grid[r][c] == fresh {
                freshCount++
            }
            
			if grid[r][c] == rotten {
				queue = append(queue, [2]int{r, c})
			}
		}
	}

	directions := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
	for len(queue) > 0 {
		minuteSize := len(queue)

		for range minuteSize {
			currX, currY := queue[0][0], queue[0][1]
			queue = queue[1:]

			for _, dir := range directions {
				newX, newY := currX+dir[0], currY+dir[1]
				if newX >= 0 && newX < rows && newY >= 0 && newY < cols {
					if grid[newX][newY] == fresh {
						grid[newX][newY] = rotten
						queue = append(queue, [2]int{newX, newY})
                        freshCount--
					}
				}
			}
		}

		if len(queue) > 0 {
			minute++
		}
	}

    if freshCount > 0 {
        return -1
    }
    
	return minute
}

Improved by AI

LLM 真是學習的好幫手 😌 挑出了這些可改善的地方:

const (
	empty  = 0
	fresh  = 1
	rotten = 2
)

var directions = [4][2]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}

func orangesRotting(grid [][]int) int {
	rows, cols := len(grid), len(grid[0])
	freshCount := 0
	queue := [][2]int{}

	for r := 0; r < rows; r++ {
		for c := 0; c < cols; c++ {
			switch grid[r][c] {
			case fresh:
				freshCount++
			case rotten:
				queue = append(queue, [2]int{r, c})
			}
		}
	}

	minute := 0
	for len(queue) > 0 && freshCount > 0 {
		minute++
		for range len(queue) { // len evaluated once, so this is the level size
			curr := queue[0]
			queue = queue[1:]
			for _, d := range directions {
				r, c := curr[0]+d[0], curr[1]+d[1]
				if r >= 0 && r < rows && c >= 0 && c < cols && grid[r][c] == fresh {
					grid[r][c] = rotten
					freshCount--
					queue = append(queue, [2]int{r, c})
				}
			}
		}
	}

	if freshCount > 0 {
		return -1
	}
	return minute
}