zoukankan      html  css  js  c++  java
  • 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()
    


  • 相关阅读:
    汉诺塔问题合集之汉诺塔6
    汉诺塔问题合集之汉诺塔5
    接口和抽象类有什么区别
    Java版本:JDK8的十大新特性介绍
    Linux的常用命令
    行为型模式——策略模式
    shell 后台执行命令
    ORA-01034:oracle不可用 的解决方法
    ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
    linux下启动oracle
  • 原文地址:https://www.cnblogs.com/bonelee/p/11668915.html
Copyright © 2011-2022 走看看