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