leetcode 39. Combination Sum-回溯算法|递归|非递归

原题链接:39. Combination Sum
拓展博文:Combination Sum II | Java最短代码实现

【思路-Java】 回溯算法|递归实现

本题采用回溯算法。

1. 基本思路是先排好序,这样做的目的是为了对数组后面不可能出现的情况进行排除,有利于减少查找时间,即剪枝操作

2. 外层循环对数组元素依次进行遍历,依次将 nums 中的元素加入中间集,一旦满足条件,就将中间集加入结果集

3. 然后每次递归中把剩下的元素一一加到结果集合中,并且把目标减去加入的元素,然后把剩下元素(包括当前加入的元素)放到下一层递归中解决子问题。

算法复杂度因为是NP问题,所以自然是指数量级的:

public class Solution {
    public List> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);
        List> res = new ArrayList<>();
        List temp = new ArrayList<>();
        dfs(res, temp, target, candidates, 0);
        return res;
    }
    private void dfs(List> res, List temp, int target,
        int[] candidates, int j) {
        if(target == 0) {  //满足条件,将中间集加入结果集
            res.add(new ArrayList<>(temp));
        }
        for(int i = j; i < candidates.length && target >= candidates[i]; i++) {  //target>=candidates[i]是剪枝操作
            temp.add(candidates[i]);
            dfs(res, temp, target - candidates[i], candidates, i);
            temp.remove(temp.size() - 1);
        }
    }
}
168 / 168  test cases passed. Runtime: 5 ms  Your runtime beats 76.66% of javasubmissions.


【思路2-Python】回溯算法|非递归实现

提供非递归实现代码
class Solution(object):
    def combinationSum(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        candidates, res, stack, lenth=sorted(set(candidates)), [], [(0, [], target)], len(candidates)
        while stack:
            i, temp, tar=stack.pop()
            while i0:
                if candidates[i]==tar: res+=temp+[candidates[i]],
                stack+=(i, temp+[candidates[i]], tar-candidates[i]),
                i+=1
        return res
168 / 168  test cases passed. Runtime: 96 ms  Your runtime beats 92.59% of pythonsubmissions.


你可能感兴趣的:(LeetCode,Backtracking,leetcode,Java,Python)