题解 | #和为S的连续正数序列#

和为S的连续正数序列

http://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe

先用暴力法解。
用一个二重循环遍历1~sum/2+1中的数。
外层循环控制该连续序列的起点,内层循环用于记录该序列以及该序列的和。
当序列和等于sum时,将当前序列加入结果集,退出内层循环。当序列和大于sum时,直接退出内层循环。
这样做时间复杂度在O(n^2),空间复杂度为O(n)。

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int>> res;
        if(!sum){
            return res;
        }
        for(int i = 1;i < sum / 2 + 1;i++){
            int count = 0;
            vector<int> temp;
            for(int j = i;j < sum / 2 + 2;j++){
                count += j;
                temp.push_back(j);
                if(count == sum){
                    res.push_back(temp);
                    break;
                }
                if(count > sum){
                    break;
                }
            }
        }
        return res;
    }
};


更好的方法是用滑动窗口的方法来做。
用两个指针来标记窗口的边界,每次计算窗口内数字的和,当和大于sum时,窗口左边界右移,当和小于sum时,窗口右边界右移。
由于连续序列的定义要求最少要两个数字,所以终止条件为窗口的右边界超过sum/2+1。
这个算法最巧妙的地方在于计算窗口中的和时,不需要累加,而直接用等差数列求和公式即可。

时间复杂度为O(n),空间复杂度为O(n)。

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int>> res;
        if(!sum){
            return res;
        }
        int left = 1;
        int right = 2;
        while(right < sum / 2 + 2){
            int count = (left + right) * (right - left + 1) / 2;
            if(count > sum){
                left++;
            }
            else if(count < sum){
                right++;
            }
            else{
                vector<int> temp;
                for(int i = left;i < right + 1;i++){
                    temp.push_back(i);
                }
                res.push_back(temp);
                right++;
            }
        }
        return res;
    }
};
全部评论

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务