剑指 Offer II 081. 允许重复选择元素的组合

Difficulty: **给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。 candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。 对于给定的输入,保证和为 target 的唯一组合数少于 150 个。 示例 1: 输入: candidates = [2,3,6,7], target = 7 输出: [[7],[2,2,3]] 示例 2: 输入: candidates = [2,3,5], target = 8 输出: [[2,2,2,2],[2,3,3],[3,5]] 示例 3: 输入: candidates = [2], target = 1 输出: [] 示例 4: 输入: candidates = [1], target = 1 输出: [[1]] 示例 5: 输入: candidates = [1], target = 2 输出: [[1,1]] 提示: 1 <= candidates.length <= 30 1 <= candidates[i] <= 200 candidate 中的每个元素都是独一无二的。 1 <= target <= 500 注意:本题与主站 39 题相同: https://leetcode-cn.com/problems/combination-sum/ **

给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。

candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。

对于给定的输入,保证和为 target 的唯一组合数少于 150 个。

示例 1:

1
2
输入: candidates = [2,3,6,7], target = 7
输出: [[7],[2,2,3]]

示例 2:

1
2
输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]

示例 3:

1
2
输入: candidates = [2], target = 1
输出: []

示例 4:

1
2
输入: candidates = [1], target = 1
输出: [[1]]

示例 5:

1
2
输入: candidates = [1], target = 2
输出: [[1,1]]

提示:

  • 1 <= candidates.length <= 30
  • 1 <= candidates[i] <= 200
  • candidate 中的每个元素都是独一无二的。
  • 1 <= target <= 500

注意:本题与主站 39 题相同:

Solution

Language: ****

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
func combinationSum(candidates []int, target int) [][]int {
    
    var n = len(candidates)
    sort.Slice(candidates,func (i,j int) bool {
        return candidates[i] < candidates[j]
    })
    var res [][]int
    var path []int
    var dfs func(cur , need int)  
    dfs = func(cur ,need int) {
        if need == 0 {
            var tmp = make([]int,len(path))
            copy(tmp,path)
            res = append(res,tmp)
            return 
        }
        if cur == n  {
            return
        }
        if need - candidates[cur]>=0 {
            //继续选择 cur
            path = append(path,candidates[cur])
            dfs(cur,need - candidates[cur])
            path = path[:len(path)-1]
        }
        //下一个
        dfs(cur+1,need)

    }
    dfs(0,target)
    return res
}