37 lines
735 B
Go
37 lines
735 B
Go
package q216
|
|
|
|
// k numbers sum up to n
|
|
|
|
func calc(k int, buf []int, offset int, remSum int, ret [][]int) [][]int {
|
|
if offset == k-1 && remSum > 0 && remSum < 10 {
|
|
buf[offset] = remSum
|
|
cp := make([]int, len(buf))
|
|
copy(cp, buf)
|
|
return append(ret, cp)
|
|
}
|
|
|
|
remK := k - offset
|
|
minI := 1
|
|
if offset > 0 {
|
|
minI = buf[offset-1] + 1
|
|
}
|
|
maxI := 9 - remK + 1
|
|
|
|
for i := minI; i <= maxI; i++ {
|
|
minSum := (i + i + remK - 1) * remK / 2
|
|
maxSum := (19 - remK) * remK / 2
|
|
if remSum < minSum || remSum > maxSum {
|
|
continue
|
|
}
|
|
|
|
buf[offset] = i
|
|
ret = calc(k, buf, offset+1, remSum-i, ret)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func combinationSum3(k int, n int) [][]int {
|
|
return calc(k, make([]int, k), 0, n, [][]int{})
|
|
}
|
|
|
|
var _ = combinationSum3
|