题目描述
本题的思路其实已经是简化的,他已经告诉我们他是一个正常的正整数序列,且是1,2,3,4,5,…这种,那么我们很容易通过首项+末项,乘以个数除以2的方式获得当前区间的和,如果连续的但是递增幅度变化的序列,我们可以采用前缀和的方式进行,此处我们不必从1一直到n,我们可以发现他的上界是n/2上取整,因为最少两个连续的子序列,第二就是利用双指针算法进行遍历了,判断是否满足的条件有两个,一个是子序列的长度大于等于2,且子序列的和等于目标值。
算法1
(前缀和+双指针) $O(n)$
C++ 代码
class Solution {
public:
vector<vector<int> > findContinuousSequence(int sum) {
vector<vector<int> > res;
vector<int> temp;
int n = (sum + 1) / 2;
// cout << n << endl;
for(int i = 1, j = 2; j <= n;)
{
int m_sum = (i + j) * (j - i + 1) / 2;
int d = j - i + 1;
if(m_sum == sum && d >= 2){
for(int k = i; k <=j; k ++ ) temp.push_back(k);
res.push_back(temp);
temp.clear();
i ++ ;
j ++ ;
}else if(m_sum < sum) j++;
else i++;
}
return res;
}
};