力扣链接:
https://leetcode-cn.com/probl...
解题思路:
- 数组求排列的解题思路,一般都是回溯法+剪枝
- 回溯法是有固定套路的,按照固定套路解题即可
- 回溯法固定套路
(1)定义起始位置,一般是数组的首位置;定义path路径,即选取的元素是哪些,定义总数和(该题目中需要总数和来确定循环结束)
(2)确定循环结束条件,本题目中总和大于等于target的时候,循环结束
(3)回溯核心代码,由于数组数字可以重复,但是[2,2,3]和[2,3,2]其实是同一个组合,那么就要保证选择的时候,不重复path,可以通过for循环来控制,i每次往后选即可
func combinationSum(candidates []int, target int) [][]int {
res := [][]int{} // 定义结果
var dfs func(start, sum int, path []int)
dfs = func(start, sum int, path []int) {
if sum >= target { // 循环结束剪枝
if sum == target {
newPath := make([]int, len(path))
copy(newPath, path)
res = append(res, newPath)
}
return
}
for i := start; i < len(candidates); i++ { // i每次加一,不重复选
path = append(path, candidates[i])
dfs(i, sum + candidates[i], path)
path = path[:len(path) - 1]
}
}
dfs(0, 0, []int{})
return res
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。