题解 | #和为S的连续正数序列#
和为S的连续正数序列
https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe
基本思路:滑动窗口,维护左端点l与右端点r,由于至少有两个数,所以循环终止条件为l < r。
通过左端点与右端点可以算出区间和,如果大于目标则右移左端点,小于则右移右端点,等于则将滑动窗口内的数存储在结果中。
由于每次只滑动一个数,且要求的是区间和,所以区间和可以在滑动窗口滑动时计算,避免了乘法运算。
class Solution { public: vector<vector<int>> FindContinuousSequence(int sum) { vector<vector<int>> res; int l = 1, r = 2, nows = 3; while (l < r) { if (nows == sum) { vector<int> tmp; for (int i = l; i <= r; i++) { tmp.push_back(i); } res.push_back(tmp); nows -= l++; } else if (nows > sum) { nows -= l++; } else { nows += ++r; } } return res; } };