[LeetCode]39. Combination Sum

39. Combination Sum

注意,题目中允许使用数组中任意值多次,不受限制,一开始的时候就因为这个卡住了,不知道应该怎么做,但有一个大概的思路就是,DFS是肯定要的了,看了别人的题解才知道怎么做。

1. DFS

class Solution(object):
    def combinationSum(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        def recursive(index, cur, path, res):
            if cur == 0:
                res.append(path)
                return
            for i in range(index, len(candidates)):
                if candidates[i] > cur:
                    return
                recursive(i, cur - candidates[i], path+[candidates[i]], res)
        res = []
        candidates.sort()
        recursive(0, target, [], res)
        return res

其实,只需要在循环中允许重复使用该下标即可,这样每次都会从该下标开始,从而解决了使用多次的疑惑。

2. 回溯算法

class Solution(object):
    def combinationSum(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        def backtracking(index, cur, path, res): 
            if cur == 0:
                res.append(list(path))  # 避免保存引用
                return
            for i in range(index, len(candidates)):
                if candidates[i] > cur:
                    return
                path.append(candidates[i])
                backtracking(i, cur - candidates[i], path, res)
                path.pop()
        res = []
        candidates.sort()
        backtracking(0, target, [], res)
        return res
posted @ 2017-08-19 11:11  banananana  阅读(110)  评论(0)    收藏  举报