今天继续刷LeetCode,第40题,求数组中的组合和。
分析:
和上一题类似,动态规划,用递归求解。区别是本身不能重复。
问题:
1、加快搜索速度,需要提前终止掉可能会重复的组合。
附上C++代码:
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
vector<vector<int>> res;
vector<int> tmp;
compute(candidates,0,tmp,res,target);
return res;
}
void compute(vector<int> & nums,int start,vector<int> & stack,vector<vector<int>> &res,int target)
{
if(target==0)
{
res.push_back(stack);
return;
}
for(int i=start;i<nums.size();i++)
{
if(i>start && nums[i]==nums[i-1])
continue;
if(target<nums[i])
break;
stack.push_back(nums[i]);
compute(nums,i+1,stack,res,target-nums[i]);
stack.pop_back();
}
}
};
附上Python代码1:
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
candidates=sorted(candidates)
res=[]
start=0
def compute(start,remain,cand,stack):
if remain==0:
if stack not in res:
res.append(stack)
return
for i in range(0,len(cand)):
if cand[i]>remain:
break
compute(i,remain-cand[i],cand[i+1:],stack+[cand[i]])
compute(start,target,candidates,[])
return res
附上优化后的Python代码2:
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
candidates.sort()
res=[]
def compute(nums,start,stack,res,target):
if target==0:
res.append(stack)
return
for i in range(start,len(nums)):
if i>start and nums[i]==nums[i-1]:
continue
if nums[i]>target:
break
compute(nums,i+1,stack+[nums[i]],res,target-nums[i])
compute(candidates,0,[],res,target)
return res
212


-40_Combination sum 2&spm=1001.2101.3001.11974&articleId=95318635&d=1&t=3&u=87313467bb574429bf3548d840f4fb15)

被折叠的 条评论
为什么被折叠?



