DeepSeek LeetCode 2350. 不可能得到的最短骰子序列 Go实现
以下是 LeetCode 2350 的 Go 语言实现:
方法一:使用布尔数组(推荐)AC
```go
func shortestSequence(rolls []int, k int) int {
seen := make([]bool, k+1)
ans := 0
count := 0
for _, x := range rolls {
if !seen[x] {
seen[x] = true
count++
if count == k {
// 完成一个完整轮次
ans++
// 重置标记数组
seen = make([]bool, k+1)
count = 0
}
}
}
return ans + 1
}
```
方法二:使用 bitset 优化(适合 k 较大的情况)
```go
func shortestSequence(rolls []int, k int) int {
ans := 0
mask := 0
target := (1 << k) - 1 // 例如 k=4 时,target=1111(二进制)
for _, x := range rolls {
mask |= 1 << (x - 1) // 将第 x-1 位置为 1
if mask == target {
ans++
mask = 0
}
}
return ans + 1
}
```
方法三:使用 map(通用写法)
```go
func shortestSequence(rolls []int, k int) int {
seen := make(map[int]bool)
ans := 0
for _, x := range rolls {
if !seen[x] {
seen[x] = true
if len(seen) == k {
ans++
seen = make(map[int]bool) // 清空
}
}
}
return ans + 1
}
```
完整测试代码
```go
package main
import "fmt"
func shortestSequence(rolls []int, k int) int {
seen := make([]bool, k+1)
ans := 0
count := 0
for _, x := range rolls {
if !seen[x] {
seen[x] = true
count++
if count == k {
ans++
seen = make([]bool, k+1)
count = 0
}
}
}
return ans + 1
}
func main() {
// 测试用例
fmt.Println(shortestSequence([]int{4,2,1,2,3,3,2,4,1}, 4)) // 输出: 3
fmt.Println(shortestSequence([]int{1,1,2,2}, 2)) // 输出: 2
fmt.Println(shortestSequence([]int{1,1,3,4}, 4)) // 输出: 1
fmt.Println(shortestSequence([]int{1,2,3,4}, 4)) // 输出: 2
}
```
算法要点
1. 核心思想:寻找完整轮次的数量
· 每一轮需要收集齐 1 到 k 的所有数字
· 每完成一轮意味着可以构造所有长度为 ans 的序列
2. Go 语言特性注意:
· 布尔数组默认值为 false
· 重置时直接创建新数组,避免手动循环清零
· 使用 range 遍历数组
3. 性能:
· 时间复杂度:O(n)
· 空间复杂度:O(k)
· bitset 版本更节省内存
运行示例
```
输入: rolls = [4,2,1,2,3,3,2,4,1], k = 4
过程:
- 第1轮: 4,2,1,3 ✅ ans=1
- 第2轮: 3,2,4,1 ✅ ans=2
- 未完成第3轮
输出: ans+1 = 3
```
更多推荐



所有评论(0)