双指针法,指针均单向移动,求和:
内存超限: 您的程序使用了超过限制的内存,case通过率为0.00%
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> result;
if(sum<=2) return result;
int small = 1, big = 2;
int tempsum;
vector<int> tmp;
while(big<=(sum+1)/2){
tempsum = (small+big)*(big-small+1)/2;
if(tempsum==sum){
for(int i=small; i<=big; i++){
tmp.push_back(i);
}
result.push_back(tmp);
}
else if(tempsum<sum){
big++;
}
else{
small++;
}
}
return result;
}
};
对照书上的代码,感觉自己的代码思路没有问题,查看答案区发现了几个问题:
1、while循环为增强鲁棒性,还要加上small<big,或者只加small<big,这样当big足够大时,small加到最后,序列和还是比目标值大,自然就会结束循环。
2、**每次找到一组结果添加到result之后,忘记处理 "指针变量" small++,这样会陷入死循环,并且一直向结果中重复添加发现的第一组结果,直到内存超限。
3、每次找到一组结果添加成功,并将small指针右移之后,还要将原来存储临时结果的数组清空。
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> result;
if(sum<=2) return result;
int small = 1, big = 2;
int tempsum;
vector<int> tmp;
while((small<(sum+1)/2) && small<big){
tempsum = (small+big)*(big-small+1)/2;
if(tempsum==sum){
for(int i=small; i<=big; i++){
tmp.push_back(i);
}
result.push_back(tmp);
//漏掉匹配成功后small++,会陷入死循环,一直重复像result中添加结果,导致内存超限
small++;
//漏掉匹配后的清空临时数组,下次会在这次的基础上叠加
tmp.clear();
}
else if(tempsum<sum){
big++;
}
else{
small++;
}
}
return result;
}
};