算法学习打卡计划

leetcode第三十九题—组合总和

2020-03-04  本文已影响0人  不分享的知识毫无意义

这道题是回溯法,所谓回溯法就是根据条件来判断,对于不满足条件的向上回溯。

1.题目

原题

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。

例子

输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[ [7], [2,2,3]]

2.解析

这道题的难点就在于元素可以重复选取。
最开始考虑的是遍历,判断数据情况,想想太麻烦了,可以用回溯法+递归解决。
回溯的关键就是建立一个递归函数,赋予一个起始位置,然后开始依次走遍历,注意定义一个保留满足条件元素的列表,用于去附加满足条件的数组。
代码就不一一解释了,可以自己看。

3.python代码

class Solution:
    def combinationSum(self, candidates, target):
        if len(candidates) < 1:
            return
        self.candidates = candidates
        self.candidates.sort()
        self.curset = []
        self.target = target
        self.lenc = len(candidates)
        self.dfs(0, 0, [])
        return self.curset

    def dfs(self, i, curtsum, cur):
        if self.candidates[i] > self.target or i > self.lenc - 1:
            return
        if curtsum == self.target:
            self.curset.append(cur)
            return
        for j in range(i, self.lenc):
            if curtsum + self.candidates[i] > self.target:
                break
            self.dfs(j, curtsum+self.candidates[j], cur + [self.candidates[j]])
上一篇 下一篇

猜你喜欢

热点阅读