题目:
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
这里依然使用双指针,貌似关于顺序或者可以排序的题目,并且不想用两层循环的都能用双指针?
这里需要用到等差数列求和公式:Sn = (a0+an)*n/2,首相末项分别是两个指针的值;
代码如下:
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
int p1 = 1;
int p2 = 2;
int sum = 0;
vector<int> ele;
vector<vector<int>> result;
while(p1<p2)
{
sum = ((p1 + p2)*(p2 - p1 + 1))/2;
if (sum == target)
{
ele = {};
//ele.clear();
for(int i = p1; i<=p2; i++)
ele.push_back(i);
p1++;
p2++;
result.push_back(ele);
}
if (sum < target) p2++;
if (sum > target) p1++;
}
return result;
}
};
需要注意的是,声明新的二维数组是vector<vector> 数组名;然后向量.clear()可以清零用,避免下次写多;还有emplace_back()貌似比push_back()好用,替换之后拿了双百。