两个方法,不知道为什么暴力比滑动窗口更耗时??
1.暴力,因为最多只能到sum/2+1,比如9,就有4和5,所以要一直推到5为止。
2.滑动窗口,定义两个指针,从1和2开始往后走,如果当前窗口内的值等于sum就加入数组,如果大于就将前一个指针++,缩小窗口。如果小于就将后一个指针++,扩大窗口。当两者相等时退出循环(用Low!=sum/2+1也行)。为什么是相等退出循环呢,因为窗口值太大才会让low++,如果一直加到等于high,证明已经没办法缩小窗口了。
区间求和,就要想到滑动窗口
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> res;
if(sum <= 0) return res;
vector<int> temp;
//暴力
/*vector<int> temp;
for(int i = 1; i <= sum/2+1; ++i){
int tempSum=i;
for(int j = i+1; j <= sum/2+1; ++j){
tempSum += j;
if(tempSum == sum){
for(int k = i; k <= j; k++){
temp.push_back(k);
}
res.push_back(temp);
temp.clear();
break;
}
else if(tempSum > sum) break;
}
}*/
int low = 1,high=2, tempSum=0;
while(low != high){
//或者结束条件是low > sum/2+1
tempSum = (low+high)*(high-low+1)/2;
if(tempSum == sum){
for(int i = low; i <= high; ++i){
temp.push_back(i);
}
res.push_back(temp);
low++;
temp.clear();
}
else if(tempSum < sum){
high++;
}
else{
low++;
}
}
return res;
}
};