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()

 

90. k数和 II

中文
English

给定n个不同的正整数,整数k(1<= k <= n)以及一个目标数字。    

在这n个数里面找出K个数,使得这K个数的和等于目标数字,你需要找出所有满足要求的方案。

样例

样例 1:

输入: [1,2,3,4], k = 2, target = 5
输出:  [[1,4],[2,3]]

样例 2:

输入: [1,3,4,6], k = 3, target = 8
输出:  [[1,3,4]]	

这个题目更简单,直接dfs模板即可做。
class Solution:
    """
    @param: A: an integer array
    @param: k: a postive integer <= length(A)
    @param: targer: an integer
    @return: A list of lists of integer
    """
    def kSumII(self, A, k, target):
        # write your code here
        path = []
        result = []
        self.dfs(A, k, target, path, result, start_index=0)
        return result
        
    def dfs(self, arr, k, target, path, result, start_index):
        if target == 0 and k == 0:
            result.append(list(path))
            return
        
        if target < 0 or k <= 0:
            return
        
        for i in range(start_index, len(arr)):
            path.append(arr[i])
            self.dfs(arr, k-1, target-arr[i], path, result, i+1)
            path.pop()

 



posted @ 2019-10-13 22:56  bonelee  阅读(290)  评论(0编辑  收藏  举报