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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40244153/article/details/87717928

题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入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时,增加big,使序列包含更多数字;(记得更新序列之和)
  当从small到big的序列的和大于s时,增加small,使序列去掉较小的数字;(记得更新序列之和)
  当从small到big的序列的和等于s时,此时得到一个满足题目要求的序列,输出,然后继续将small增大,往后面找新的序列。
  序列最少两个数字,因此,当small到了s/2时,就可以结束判断了。

public class Solution {
    public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
        ArrayList<ArrayList<Integer>> res= new ArrayList<>();
        if (sum < 3) return res;
        int small = 1;
        int big = 2;
        int tmp = small + big;
        int p = 0 ;
        while(small <= sum/2){
            if ( tmp > sum ){
                tmp = tmp - small;
                small ++;
            }else if(tmp < sum){
                big ++ ;
                tmp = tmp + big;
            }else{
                ArrayList<Integer> t= new ArrayList<>();
                for(int i = small;i <= big ;i++){
                    t.add(i);
                }
                res.add(t);
                p++;
                tmp = tmp - small;
                small++;
            }
        }
        return res;
    }
}

收获:
  1.还是利用两个指针,这个技巧要学会
  2.代码中求连续序列的和,并没有每次遍历计算,而是根据每次操作的情况而在之前的结果上进行加减,可以提高效率,值得学习
  3.和为s的两个数字中的指针是从两端开始,本题指针从1,2开始,注意指针的初始设置。

猜你喜欢

转载自blog.csdn.net/weixin_40244153/article/details/87717928