LeetCode 39. Combination Sum

10-13 LeetCode 39. Combination Sum

Combination Sum

Description

Given a set of candidate numbers (C) (without duplicates) 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:

  1. All numbers (including target) will be positive integers.

  2. The solution set must not contain duplicate combinations.

提供一个不包含重复数字的数字集合以及一个目标数。在集合中找出所有不同的组合使数字和等于目标数。

集合中的同一个数字可以重复使用任意次数

提示:

  1. 所有数字都是正数

  2. 集合不包含任何重复数字

例子:

given candidate set [2, 3, 6, 7] and target 7

集合为[2, 3, 6, 7],目标数为7

则所有结果如下:

[

    [2, 2, 3], 

    [7]

]

Solution 1:

像这种需要求出所有不同的组合的题目一般用递归来完成,似乎是叫回溯还是什么的一个算法。递归的尝试每一种组合,如果满足和等于目标值,则记下该组合,题目看起来好像已经解决了。但是我在写代码时遇到的最大的一个问题是,如何记录下每一个组合,最后发现也很简单,但确实卡了我一段时间,所以刷题的时候需要自己动手写一写,虽然题目看上去很简单,但是代码实现上还是有很多细节需要注意。

代码:

class Solution(object):

    def combinationSum(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        self.result = []
        self.sum = target
        candidates.sort()
        self.get_sum(candidates, 0, 0, [])
        return self.result

    def get_sum(self, candidates, index, sum_now, lists):
        if sum_now > self.sum:
            return
        elif sum_now == self.sum:
            self.result.append(lists)
            return
        for i in range(index, len(candidates)):
            self.get_sum(candidates, i, sum_now+candidates[i], lists+
            [candidates[i]])

改进:

提交后运行速度不太理想,参考了下运行速度第一的代码,看完了觉得确实应该比我的要快一些,在递归的判断上有些区别,所以他的循环次数会比我的少一些,从而提高了运行速度,这些代码上的优化肯定需要长时间的多写多想。。

除此之外,他用来记录组合的方法是我做题时想到的第一个想法,只是我当时不知道如何实现。那个想法是只定义一个列表来保存组合,这个列表在递归的过程中不断变化,解释的不清楚,直接上代码。

class Solution(object):

def combinationSum(self, candidates, target):
    """
    :type candidates: List[int]
    :type target: int
    :rtype: List[List[int]]
    """
    if not candidates or not target:
        return []
    candidates.sort()
    self.res = []
    self.dfs(candidates, 0, target, [])
    return self.res

def dfs(self, candidates, start, remain_target, ans):
    if remain_target == 0:
        self.res.append(ans[:])
        return
    
    for i in xrange(start, len(candidates)):
        if candidates[i] > remain_target:
            break
        ans.append(candidates[i])
        self.dfs(candidates, i, remain_target - candidates[i], ans)
        del ans[-1]

感想

今天的题目不难,但是发现了另外的一个问题:语言表达能力不够。会写与能解释给别人听是两个境界吧,看到题目以后觉得就是那样写就可以了,但是解释的时候却解释不出来那样是哪样。。。继续努力吧。。。。。。。。。。。

你可能感兴趣的:(LeetCode 39. Combination Sum)