51 lines
701 B
Go
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
|