剑指offer双指针 57-II.和为s的连续正数序列
Posted trevo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer双指针 57-II.和为s的连续正数序列相关的知识,希望对你有一定的参考价值。
双指针
[l,r]的区间和:s = (l + r) * (r - l + 1) / 2
通过利用l和r两个指针,初始l=1,r=2;
如果s == target,将[l,r]的数组添加到结果res中,l++;
如果s < target, r++;
如果s > target, l++;
时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int>> res;
vector<int> v;
int l = 1, r = 2;
while(l < r)
{
int sum = (l + r) * (r - l + 1) / 2;
if(sum == target){
v.clear();
for(int i = l; i <= r; ++i) v.push_back(i);
res.push_back(v);
l++;
}
else if(sum < target) r++;
else l++;
}
return res;
}
};
滑动窗口
不适用求和公式
比双指针效率更高些,减少多余的计算;
时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int>> res;
int i = 1;
int j = 1;
int sum = 0;
while (i <= target / 2)
{
if (sum < target)
{
// 右边界向右移动
sum += j;
j++;
} else if (sum > target)
{
// 左边界向右移动
sum -= i;
i++;
} else
{
vector<int> arr;
for (int k = i; k < j; k++) arr.push_back(k);
res.push_back(arr);
// 左边界向右移动
sum -= i;
i++;
}
}
return res;
}
};
以上是关于剑指offer双指针 57-II.和为s的连续正数序列的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode剑指 Offer 57 - II. 和为s的连续正数序列(双指针)
[LeetCode]剑指 Offer 57 - II. 和为s的连续正数序列