zoukankan      html  css  js  c++  java
  • 【剑指offer】和为S的连续整数序列

    找到所有和为S的连续整数序列,序列长度>=2

    我的思路:数学法,限定首元素范围,计算序列长度。

    书上解法:用small和big两个游标记录序列的开始和结束位置,调整游标。

    我的解法:

    /*
    ​直接用数学方法做的
    等差数列公式  2*n*a1+n(n-1)/2 = s; 由n>= 2 得 a1 <= (s - 1)/2
    对首位数字a1从1到 (s - 1)/2遍历
    等差数列公式变形   n*n+(2*a1 - 1)n-2s = 0
    可得                        n = [-(2a - 1) + sqrt((2a - 1) * (2a - 1) + 8s)]/2
    检验n是否为整数,是则得到一个答案
    */
    class Solution {
    public:
        vector<vector<int> > FindContinuousSequence(int sum) {
            vector<vector<int> > ans;
            int maxA1 = (sum - 1) / 2; //sum = n*a1 + n(n-1)/2 n最小为2 推导得到
            for(int i = 1; i <= maxA1; i++) //首位数字遍历
            {
                double f = (sqrt(double((2 * i - 1) * (2 * i - 1) + 8 * sum)) + 1 - 2 * i) / 2; //计算长度
                int n = int(f);
                if(abs(f - n) < 0.000001) //长度是整数,有效
                {
                    vector<int> tempans;
                    for(int j = 0; j < n; j++)
                        tempans.push_back(i + j);
                    ans.push_back(tempans);
                }
            }
            return ans;
        }
    };
  • 相关阅读:
    使用IDENTITY列属性和Sequence对象
    使用OFFSET-FETCH进行数据过滤
    SQL 插入语句汇总
    建立&修改视图
    Centos 7.x 搭建 Zabbix3.4
    RDS 导出Mysqlbinlog_二进制日志
    Yac
    云服务器漏洞更新
    Centos 内存释放
    Centos 安装 Htop
  • 原文地址:https://www.cnblogs.com/dplearning/p/4646776.html
Copyright © 2011-2022 走看看