以下是 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
```

 

更多推荐