【4月打卡,联动Leetcode-829】面试题57 - II. 和为s的连续正数序列

题目链接

前缀和

由于做了太多前缀和,导致我麻木地直接写了前缀和。
但是无论是map的维护还是很多数字的加和都让这个解法很糟糕

class Solution {
public:
    vector<vector<int>> findContinuousSequence(int target) {
        vector<vector<int>> res;
        map<int,int> mp;
        long sum=0;
        for(int i=0;i<=target/2+1;i++)
        {
            sum+=i;
            if(mp.find(sum-target)!=mp.end())
            {
                vector<int> tmp;
                for(int k=mp[sum-target]+1;k<=i;k++)
                    tmp.push_back(k);
                res.push_back(tmp);
            }
            mp[sum]=i;
        }
        return res;
    }
};

滑动窗口

滑动窗口的速度是双百。
思路:一旦窗口内和大于目标值,证明窗口过大,左侧开始收缩,如果窗口和恰好为目标值,记录。

class Solution {
public:
    //滑动窗口
    vector<vector<int>> findContinuousSequence(int target) {
        vector<vector<int>> res;
        int lf=1,rt=1,sum=0;
        while(rt<=target/2+1)
        {
            sum+=rt;
            while(sum>target)
            {
                sum=sum-lf;
                lf++;
            }                
            if(sum==target)
            {
               vector<int> tmp;
               for(int j=lf;j<=rt;j++)
                tmp.push_back(j);
               res.push_back(tmp);
            }       
            rt++;
        }
        return res;
    }
};

梦幻联动——【Leetcode-829】 连续整数求和

在评论区,我发现了这道明明要求更低却难度为hard的相似题。
题目链接
于是我填入相同的滑动窗口解法,喜提超时,是时候该考虑数学解法了。

数学解法
对于一个首项为a1a_1,公差为1,项数为n的等差数列:
sum=na1+n(n1)2=target sum=na_1+\frac{n*(n-1)}{2}=target
所以我们可以推出:
targetn(n1)2n=a1 \frac{target-{\frac{n*(n-1)}{2}}}{n}=a_1

//此处为面试题57 - II. 和为s的连续正数序列的代码
class Solution {
public:
    vector<vector<int>> findContinuousSequence(int target) {
        vector<vector<int>> res;
        for(int i=sqrt(2*target);i>=2;i--)
        {
            if((target-i*(i-1)/2)%i==0)
            {
                int num=(target-i*(i-1)/2)/i;
                vector<int> tmp;
                for(int j=num;j<num+i;j++)
                {
                    tmp.push_back(j);
                } 
                res.push_back(tmp);
            }
        }
        return res;
    }
};

【Leetcode-829】 连续整数求和

class Solution {
public:
    int consecutiveNumbersSum(int N) {
        int cnt=0,sum=0;
        for(int i=1;i<=sqrt(2*N);i++)
        {
            if((N-sum)%i==0)
                cnt++;
            sum+=i;//sum=下一轮的(i-1)*i/2;
        }
        return cnt;
    }
};
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读