剑指offer:和为S的连续正数序列

http://wiki.jikexueyuan.com/project/for-offer/question-forty-one.html

例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以结果打出 3 个连续序列 1~5、4~6 和 7~8

考虑用两个数 small 和 big 分别表示序列的最小值和最大值。

首先把 small 初始化为 1,big 初始化为 2。

如果从 small 到 big 的序列的和大于 s,我们可以从序列中去掉较小的值,也就是增大 small 的值。

如果从 small 到 big 的序列的和小于 s,我们可以增大 big,让这个序列包含更多的数字。

因为这个序列至少要有两个数字,我们一直增加 small 到(1+s)/2 为止。

以求和为 9 的所有连续序列为例,我们先把 small 初始化为 1,big 初始化为 2。

此时介于 small 和 big 之间的序列是{1,2},序列的和为 3,小于 9,所以我们下一步要让序列包含更多的数字。我们把 big 增加 1 变成 3,此时序列为{I, 2,3}。

由于序列的和是 6,仍然小于 9,我们接下来再增加 big 变成 4,介于 small 和 big 之间的序列也随之变成{ l, 2, 3, 4}

。由于列的和 10 大于 9,我们要删去去序列中的一些数字, 于是我们增加 small 变成 2,此时得到的序列是{2, 3, 4},序列的和E好是 9。

我们找到了第一个和为 9 的连续序列,把它打印出来。

接下来我们再增加 big及small,重复前面的过程,可以找到第二个和为 9 的连续序列{4,5}。

public java.util.ArrayList<java.util.ArrayList<Integer>> FindContinuousSequence(int sum) {
            java.util.ArrayList<java.util.ArrayList<Integer>> list = new ArrayList<java.util.ArrayList<Integer>>();
            if(sum==1){
                java.util.ArrayList<Integer> data = new java.util.ArrayList<Integer>();
                data.add(1);
                list.add(data);
            }
            if(sum==2){
                java.util.ArrayList<Integer> data = new java.util.ArrayList<Integer>();
                data.add(2);
                list.add(data);
            }

            int middle = (sum+1)/2;
            int after =1;
            int before =2;
            int total=0;
            while(after<=middle){
                for(int i=after;i<=before;i++){
                    total += i;
                }
                if(total==sum){
                    java.util.ArrayList<Integer> data = new java.util.ArrayList<Integer>();
                    for(int i=after;i<=before;i++){
                        data.add(i);
                    }
                    list.add(data);
                    after++;
                    before++;

                }else if(total>sum){
                    after++;
                }else if(total<sum){
                    before++;
                }
            }

            return list;
        }
时间: 2024-10-26 02:04:21

剑指offer:和为S的连续正数序列的相关文章

剑指Offer——和为S的连续正数序列

题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22.现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输入描述: 输出所有和为S的连续正数序列.序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 分析: 假设 i,j 分别是第一个数和最

剑指Offer40 和为s的连续正数序列

1 /************************************************************************* 2 > File Name: 40_ContinuesSequenceWithSum.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月04日 星期日 15时52分42秒 6 **************************

剑指Offer面试题:28.连续子数组的最大和

一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18. 这个题目在我去年参加校园招聘时,某公司的二面采用了机试,而题目刚好就是这道题.一般看到这道题目就会想到枚举出数组的所有子数组并求出它们的和.一个长度为n的数组,总共有n(n+1)/2个子数组.计算

【剑指offer】面试题 42. 连续子数组的最大和

面试题 42. 连续子数组的最大和 NowCoder 题目描述 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 注意: 要求时间复杂度为 O(n). Java 实现 public class Solution { public int FindGreatestSumOfSubArray(int[]

剑指offer(四十一)之翻转单词顺序列

题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 代码: <span style="font-family:SimSun;fon

剑指Offer:栈的压入/弹出序列

栈的压入/弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { //

剑指Offer--041-和为S的连续正数序列

链接 牛客OJ:和为S的连续正数序列 九度OJ:http://ac.jobdu.com/problem.php?pid=1354 GitHub代码: 041-和为S的连续正数序列 CSDN题解:剑指Offer–041-和为S的连续正数序列 牛客OJ 九度OJ CSDN题解 GitHub代码 041-和为S的连续正数序列 1354-和为S的连续正数序列 剑指Offer–041-和为S的连续正数序列 041-和为S的连续正数序列 题意 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~

C++中求数组连续子向量的最大和(牛客剑指offer)

/////////////////////////////////////////////////////////////////// //HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学. //今天测试组开完会后,他又发话了:在古老的一维模式识别中, //常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决. //但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢? //例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开

【剑指offer】和为定值的连续正数序列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27823291 题目描写叙述: 小明非常喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他立即就写出了正确答案是100.可是他并不满足于此,他在想到底有多少种连续的正数序列的和为100(至少包含两个数).没多久,他就得到还有一组连续正数和为100的序列:18,19,20,21,22.如今把问题交给你,你能不能也非常快的找出全部和为S的连续正数序列? Good Luck! 输入:

【剑指offer】Q41:和为s的连续正数序列

def sumS(s): if s <= 0: return re = [] first = 1; last = 2; cursum = first + last while first <= s >> 1: if cursum < s: last += 1 cursum += last else: if cursum == s: re.append((first, last)) cursum -= first first += 1 return re [剑指offer]Q4