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

和为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;
    }
}
posted @ 2018-07-20 09:06  LynnMin  阅读(195)  评论(0编辑  收藏  举报