zoukankan      html  css  js  c++  java
  • LeetCode#39 Combination Sum

    Problem Definition:

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

    The same repeated number may be chosen from C unlimited number of times.

    Note:

    • All numbers (including target) will be positive integers.
    • Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1a2 ≤ … ≤ ak).
    • The solution set must not contain duplicate combinations.

    For example, given candidate set 2,3,6,7 and target 7,
    A solution set is:

    [7]
    [2, 2, 3]

    Solution:

    回溯法(DFS)。每个元素可以被重复用很多次,因此DFS时子节点应当包括当前节点本身(或者说是再构造一个新的节点,包含了当前元素)。

    另一个问题 Combination Sum,则不应该包括当前节点本身。

     1 # @param {integer[]} candidates
     2     # @param {integer} target
     3     # @return {integer[][]}
     4     def combinationSum(self, candidates, target):
     5         candidates.sort()
     6         res=[]
     7         self.cur(candidates, target, 0, [], res)
     8         return res
     9         
    10     def cur(self, nums, target, index, localArr, res):
    11         if target==0:
    12             res.append(localArr[:])
    13         else:
    14             for i in range(index, len(nums)):
    15                 nt=target-nums[i]
    16                 if nt>=0:
    17                     localArr.append(nums[i])
    18                     self.cur(nums, nt, i, localArr, res)
    19                     localArr.pop()
    20                 else:
    21                     break

     另外,在cur的for循环里,如果nt已经小于零,则不继续进行没必要的递归,也因为外围的 if-else 就不用处理target<0的情况了。

  • 相关阅读:
    事件基础
    DOM
    GoWeb编程之多路复用
    GoWeb编程之HelloWorld
    Linux libtins 库安装教程
    模式串匹配KMP详解
    树的重心
    Light OJ 1064
    Light OJ 1060
    1057
  • 原文地址:https://www.cnblogs.com/acetseng/p/4702313.html
Copyright © 2011-2022 走看看