面试题57 - II. 和为s的连续正数序列
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
方法
1. 暴力:
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int> > res;
for(int i = 1; i < target; i++) {
int j = i, sum = 0;
vector<int> v;
while(sum < target) {
sum += j;
v.push_back(j);
j++;
}
if(sum == target) {
res.push_back(v);
}
}
return res;
}
};
优化 (滑动窗口) (尺取法)
左边界小于 target / 2就可以了因为只能取到两个连续整数, 如果target / 2 + target / 2 + 1都不能满足, target / 2 + 1 + targe5 / 2 + 2一定 > target
sum 为此时连续数字相加的值, 如果值 > target sum - i, i++ 如果值 < target , sum + j, j++; (注意顺序, sum 先 加上 j j再++)
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int> > res;
int i = 1, j = 1, sum = 0;
while(i <= (target + 1) / 2) {
if(sum < target) {
sum += j;
j++;
} else if(sum > target) {
sum -= i;
i++;
}
if(sum == target) {
vector<int> v;
for(int k = i; k < j; k++) {
v.push_back(k);
}
res.push_back(v);
sum -= i;
i++;
}
}
return res;
}
};