码迷,mamicode.com
首页 > 其他好文 > 详细

dfs --path sum 问题 本质上就是组合问题(有去重)

时间:2019-10-13 23:35:17      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:highlight   问题   example   end   turn   notice   tin   ons   去重   

135. 数字组合

中文
English

给定一个候选数字的集合 candidates 和一个目标值 target. 找到 candidates 中所有的和为 target 的组合.

在同一个组合中, candidates 中的某个数字不限次数地出现.

样例

样例 1:

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

样例 2:

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

注意事项

  1. 所有数值 (包括 target ) 都是正整数.
  2. 返回的每一个组合内的数字必须是非降序的.
  3. 返回的所有组合之间可以是任意顺序.
  4. 解集不能包含重复的组合.
class Solution:
    """
    @param candidates: A list of integers
    @param target: An integer
    @return: A list of lists of integers
    """
    def combinationSum(self, candidates, target):
        # write your code here
        result = []
        self.dfs(sorted(list(set(candidates))), target, result, path=[], start_index=0)
        return result
    
    def dfs(self, nums, target, result, path, start_index):
        if target == 0 and path:
            result.append(list(path))
        
        if target < 0:
            return
        
        for i in range(start_index, len(nums)):
            path.append(nums[i])
            self.dfs(nums, target-nums[i], result, path, i)
            path.pop()

 

153. 数字组合 II

中文
English

给定一个数组 num 和一个整数 target. 找到 num 中所有的数字之和为 target 的组合.

样例

样例 1:

输入: num = [7,1,2,5,1,6,10], target = 8
输出: [[1,1,6],[1,2,5],[1,7],[2,6]]

样例 2:

输入: num = [1,1,1], target = 2
输出: [[1,1]]
解释: 解集不能包含重复的组合

注意事项

  1. 在同一个组合中, num 中的每一个数字仅能被使用一次.
  2. 所有数值 (包括 target ) 都是正整数.
  3. 返回的每一个组合内的数字必须是非降序的.
  4. 返回的所有组合之间可以是任意顺序.
  5. 解集不能包含重复的组合.
class Solution:
    """
    @param num: Given the candidate numbers
    @param target: Given the target number
    @return: All the combinations that sum to target
    """
    def combinationSum2(self, nums, target):
        # write your code here
        result = []
        self.dfs(sorted(nums), target, result, path=[], start_index=0)
        return result
     
    def dfs(self, nums, target, result, path, start_index):
        if target == 0 and path:
            result.append(list(path))
         
        if target < 0:
            return
         
        for i in range(start_index, len(nums)):
            if i > 0 and nums[i] == nums[i-1] and i > start_index:
                continue
            path.append(nums[i])
            self.dfs(nums, target-nums[i], result, path, i+1)
            path.pop()

 

dfs --path sum 问题 本质上就是组合问题(有去重)

标签:highlight   问题   example   end   turn   notice   tin   ons   去重   

原文地址:https://www.cnblogs.com/bonelee/p/11668915.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!