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

和为S的连续正数序列

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

import java.util.ArrayList;
 /**连续正数序列等于某一个值即等差数列和等于某一个值
     * 等差数列求和公式为(a1 + an) * n / 2 = sum
     * 我们假设序列长度为x,起始值为i那么此公式可转换为方程:(i + i + x - 1) * x / 2 = sum
     * 整理后可得x^2 + (2i - 1)x - 2sum = 0明显是一个一元2次方程式
     * 求输出和为s的连续正整数序列 我们可以从1开始找,找到(s + 1) / 2即能找到所有连续子序列(为什么是(s + 1) / 2可以好好想想 比如11可以是[5, 6]))
     * 因此我们可以在1~ s / 2中所有令方程式有正整数解的i即为连续正整数序列的头
     * @param sum
     * @return
     */
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
         ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
        if (sum <= 1){
            return lists;
        }
        int end = (sum + 1) / 2;
        for(int i = 1; i < end; i++){
            int num = solve(1, 2 * i - 1, -2 * sum);
            if (num != 0){//找到正整数解 加入此连续序列
                ArrayList<Integer> list = new ArrayList<>();
                for (int j = i; j < i + num; j++){
                    list.add(j);
                }
                lists.add(list);
            }
        }
        return lists;
    }
    
  /**
     * 因为a > 0 b > 0
     * 所以正整数解只可能出现在(-b + Math.sqrt(delta)) / (2 * a)这个计算式里
     * @param a
     * @param b
     * @param c
     * @return
     */
    public int solve(int a, int b, int c){//a > 0, b > 0
        double delta = Math.pow(b, 2) - 4 * a * c;
        if (delta < 0){//delta < 0直接返回0
            return 0;
        }
        int res;
        double num;
        num = (-b + Math.sqrt(delta)) / (2 * a);
        res = (int) num;
        if (res == num && res > 0){//res是正整数返回
            return res;
        }
        return 0;//无正整数解
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
12-18 18:50
已编辑
门头沟学院 golang
牛客33637108...:重点是要事已密成,在没有进入这家公司之前,不要有任何的泄露信息,我之前跟你一样,面了一家光伏设备厂,底薪7500加上出差补贴大概有13,000左右,已经给了口头offer了,甚至要了我的在校成绩的所有信息,还向我要了三方的网签二维码,到后面还是毁约了,我干过最愚蠢的事情就是向同学透露要签三方的事,之后的失败只会让他们幸灾乐祸,这是即将结束的大学生活给我的最后一课,不要相信任何的口头三方,该面的就去面,甚至签了三方也有毁约的可能,就像我现在签了三方还在外面实习呢,春招还是要继续参加的,不能停止面试,不然到后面毁三方的时候,重新捡起的面试很麻烦的,这是我一点点小小的见解。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务