lc-go/solutions/0/q77/solution.go
2026-01-17 12:51:40 +09:00

51 lines
701 B
Go

package q77
var (
allocBuf []int
allocP int
)
func alloc(sz int) []int {
if allocBuf == nil || allocP+sz > 8192 {
allocP = 0
allocBuf = make([]int, 8192)
}
ret := allocBuf[allocP : allocP+sz]
allocP += sz
return ret
}
func combine(n int, k int) [][]int {
buf := alloc(k)
for i := range buf {
buf[i] = i + 1
}
sz := 1
for i := 1; i <= k; i++ {
sz = sz * (n - i + 1) / i
}
ret := make([][]int, 0, sz)
for {
t := alloc(k)
copy(t, buf)
ret = append(ret, t)
if buf[0] == n-k+1 {
break
}
buf[k-1]++
i := k - 1
for ; i > 0 && buf[i] > n-(k-1-i); i-- {
buf[i-1]++
}
for i++; i < k; i++ {
buf[i] = buf[i-1] + 1
}
}
return ret
}
var _ = combine