和为S的连续正数序列

暴力

枚举区间起点 i,对于每一个 i,找到最大的 j ,满足 ij 区间和<target

class Solution {
public:
    vector<vector<int> > findContinuousSequence(int sum) {
        vector<vector<int> > res;
        for (int i = 1; i < sum; i ++ )
        {
            int j=i,t=0;
            vector<int> q;
            while(t<sum)
            {
                t+=j;
                q.push_back(j);
                j++;
            }
            if(t==sum)  res.push_back(q);
        }
        return res;
    }
};

二分优化

寻找 j 的过程可以使用二分,复杂度降为O(nlogn)

双指针优化

可以发现,i 后移,j 单调后移,可以使用双指针优化掉一层循环,复杂度降为O(n)

class Solution {
public:
    vector<vector<int> > findContinuousSequence(int sum) {
        vector<vector<int> > res;
        for (int i = 1,j=1,s=0; i < sum; i ++ )
        {
            while(s<sum)
            {
                s+=j;
                j++;
            }
            if(s==sum)
            {
                vector<int> q;
                for (int k = i; k < j; k ++ )  q.push_back(k);
                res.push_back(q);
            }
            s-=i;
        }
        return res;
    }
};
posted @   穿过雾的阴霾  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示