链接:https://leetcode.cn/problems/combination-sum-ii
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
来源:力扣(LeetCode)
问题描述
做题的时候整体的逻辑正确却不通过!
class Solution {
private:
vector> result;
int sum;
vector cur;
void findcomb(vector& candidates,int startp){
if(sum<=0){
if(sum==0) result.push_back(cur);
return;
}
for(int i=startp;i=0;i++){
if(candidates[i-1]==candidates[i]&&i>startp) continue;
sum-=candidates[i];
cur.push_back(candidates[i]);
findcomb(candidates,i+1);
cur.pop_back();
sum+=candidates[i];
}
}
public:
vector> combinationSum2(vector& candidates, int target) {
sum=target;
result.clear();
cur.clear();
sort(candidates.begin(),candidates.end());
findcomb(candidates,0);
return result;
}
};
原因分析:
&&:通过调试查阅资料发现是运算符&&的运算逻辑没有搞清楚。
为逻辑与运算符,判断顺序为从左往右,当左右两边表达式同时为真时,结果为 真。当不满足两个式子为真时,就有如下的情况:,当左边的式子为假时,不在判断右边的式子,输出结果为 假。
if(candidates[i-1]==candidates[i]&&i>startp) continue;
sum-=candidates[i];
cur.push_back(candidates[i]);
findcomb(candidates,i+1);
cur.pop_back();
sum+=candidates[i];
}
当i=0时&&左边的表达式为candidates[-1]==candidates[0]存在错误,所以报错。
将其调换顺序,通过i>startp将i=0的情况剔除出去,程序就不报错了。
for(int i=startp;i=0;i++){ if(i>startp&&candidates[i-1]==candidates[i]) continue; sum-=candidates[i]; cur.push_back(candidates[i]); findcomb(candidates,i+1); cur.pop_back(); sum+=candidates[i]; }
在做题学习的时候记录了这个问题,希望对你有所帮助~



