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

Posted bonelee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfs --path sum 问题 本质上就是组合问题(有去重)相关的知识,希望对你有一定的参考价值。

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 问题 本质上就是组合问题(有去重)的主要内容,如果未能解决你的问题,请参考以下文章

Path Sum II - LeetCode

[LeetCode] 437. Path Sum III_ Easy tag: DFS

22. Generate Parentheses——本质:树,DFS求解可能的path

leetcode-----39. 组合总和

HDU-1258 Sum It Up (DFS)

刷题感悟- Binary Tree Path Sum