版权声明:本文为博主原创文章,未经博主允许不得转载。 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开始,注意指针的初始设置。