1. 程式人生 > >劍指Offer--和為s的連續正數序列

劍指Offer--和為s的連續正數序列

solution 範圍 要求 感覺 輸出 enc 需要 元素 arraylist

和為s的連續正數序列

題目 小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列?
輸出描述 輸出所有和為S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序。
初步思路 劃定範圍首先1~s/2,後來想著根據奇偶數劃分,但是這樣似乎太狹隘。再後來感覺和等差求和有點相似,所以就有下面幾個限定條件:① s=na1+n(n-1)/2;② a1<=s/2; ③ a1>0;④ n>=2;根據以上四個條件進行查找;采用插入排序將其進行序間排序


自己寫的low代碼

import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int s) {
    /*      ArrayList<ArrayList<Integer>> list = new ArrayList();
        if (s <= 0) {
            return list;
        }
        int a1 = 0;
        int n = 2;

        for (;; n++) {
            a1 = s / n + (1 - n) / 2;
            if (a1 <= 0 || a1 > s / 2) {
                break;
            }
            int sum = n*a1+n*(n-1)/2;
            if(sum==s) {
                ArrayList<Integer> list1= new ArrayList();
                for(int i=0;i<n;i++) {
                    list1.add(a1+i);
                }
                list.add(list1);
            }

        }
        return list;*/
        //上面這種不符合序列建按照開始數字從小到大的順序;
        ArrayList<ArrayList<Integer>> list = new ArrayList();
        if (s <= 0) {
            return list;
        }
        int a1 = 0;
        int n = 2;

        for (;; n++) {
            a1 = s / n + (1 - n) / 2;
            if (a1 <= 0 || a1 > s / 2) {
                break;
            }
            int sum = n * a1 + n * (n - 1) / 2;

            if (sum == s) {
                ArrayList<Integer> list1 = new ArrayList();
                for (int i = 0; i < n; i++) {
                    list1.add(a1 + i);
                }
                for (int i = 0; i < list.size(); i++) {
                    if (list1.get(0) < list.get(i).get(0)) {
                        list.add(new ArrayList()); //需要添加一個新的元素;
                        for (int j = list.size()-1; j > i; j--) {
                            list.set(j, list.get(j - 1));
                        }
                        list.set(i, list1);
                        break;

                    }
                }
                if(!list.contains(list1)) {
                    list.add(list1);
                }
            }

        }
        return list;
    }
}

劍指Offer--和為s的連續正數序列