剑指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;
}
}
多思考,多尝试。