• 和为S的连续正数序列★★


    题目描述

    小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
     

    输出描述:

    输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

    解题思路:

    思路一:

    自己想了一个复杂度为sum*log(sum)的想法,通过了所有case,但是感觉如果sum很大的话,可能会超时。其实就是对二分算法的改造,搜索左右区间的条件变成了判断

    mid*(mid+1)/2-i*(i+1)/2 < sum ,也就是判断i到mid的和与sum的关系。

    思路二:

    看谈论区有滑动窗口的思路,之后研究

    class Solution {
    public:
        vector<vector<int> > FindContinuousSequence(int sum) {
            vector<vector<int> > res;
            if(sum < 2) return res;
            for(int i= 0; i < sum; i++){
                int l = i;
                int r = sum-1;
                int mid = (l+r)/2;
                while(l <= r){
                    mid = (l+r)/2;
                    //cout<<"i="<<i <<" l="<<l<<" r="<<r <<" mid="<<mid <<" Cn="<<mid*(mid+1)/2 - i*(i+1)/2 <<endl;
                    if(mid*(mid+1)/2 - i*(i+1)/2 < sum){
                        l = mid+1;
                    }else if(mid*(mid+1)/2 - i*(i+1)/2 > sum){
                        r = mid-1;
                    }else{
                        break;
                    }
                }
                vector<int> vct;
                if(mid*(mid+1)/2 - i*(i+1)/2 == sum){
                    //cout<<"i"<<i<<" mid"<<mid<<endl;
                    for(int j = i+1; j <= mid; j++){
                        if(j <= 0) continue;
                        vct.push_back(j);
                    }
                    if(vct.size() >= 2) res.push_back(vct);
                }
            }
            return res;
        }
    };
    

      

  • 相关阅读:
    MySQL日期数据类型、时间类型使用总结
    mybatis中的mapper接口文件以及example类的实例函数以及详解
    IDEA 的快捷键简单使用
    Enum强制转换
    保存信息到配置文件
    通过配置文件判断程序首次启动
    StackPanel Binding
    RadGridView样式设置与Binding
    虚拟键盘输入之回车事件绑定与鼠标点击事件绑定
    数据库基础之-范式
  • 原文地址:https://www.cnblogs.com/chengsheng/p/10684554.html
Copyright © 2020-2023  润新知