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


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

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

本题采用回溯算法。

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

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

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

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

public class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
List<List<Integer>> res = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
dfs(res, temp, target, candidates, 0);
return res;
}
private void dfs(List<List<Integer>> res, List<Integer> 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 i<lenth and tar>0:
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.


智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告