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

题目描述

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

输出描述:

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
 
使用数组保存当前序列,当前序列和>sum则减去数组第一个数字,当前序列和=sum则保存当前序列,
 1 public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {//my
 2         ArrayList<ArrayList<Integer>> re = new ArrayList<>();
 3         ArrayList<Integer> list = new ArrayList<>();
 4         int end = sum/2+1;
 5         int countSum =0;
 6         for(int i=1;i<=end;i++){
 7             list.add(i);
 8             countSum +=i;
 9             while(countSum>sum){
10                 countSum-=list.get(0);
11                 list.remove(0);
12             }
13             if(countSum==sum&&list.size()>1){
14                 ArrayList<Integer> l= new ArrayList<>();
15                 l.addAll(list);
16                 re.add(l);
17             }
18         }
19         return re;
20     }

 

记录当前序列两端的值,不用额外的数值保存当前的值

 1 public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {//mytip
 2         ArrayList<ArrayList<Integer>> re = new ArrayList<>();
 3         int i =1;
 4         int j =2;
 5         int end = sum/2+1;
 6         while(j<=end){
 7             int count = (i+j)*(j-i+1)/2;
 8             if(count==sum&&j!=i){
 9                 ArrayList<Integer> l= new ArrayList<>();
10                 for(int k =i;k<=j;k++){
11                     l.add(k);
12                 }
13                 re.add(l);
14                 j++;
15             }
16             else if(count>sum){
17                 i++;
18             }
19             else{
20                 j++;
21             }
22         }
23         return re;
24     }

 

 



posted @ 2019-04-15 14:59  月半榨菜  阅读(92)  评论(0编辑  收藏  举报