Acwing76.和为S的连续整数序列——java集合使用clear()清空集合的注意点

题目描述:
输入一个非负整数 S,打印出所有和为 S 的连续正数序列(至少含有两个数)。

例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以结果打印出 3 个连续序列 1∼5、4∼6 和 7∼8。

示例:

输入:15

输出:[[1,2,3,4,5],[4,5,6],[7,8]]

算法思路:
本题,直接使用双指针即可解决,定义两个指针slow和fast,slow从第一个元素开始,然后fast初始位置比slow+1,依次遍历fast累加看是否达到sum值,然后将每次的值存入到list当中,满足条件将整个list存入到一个res列表当中,再次清空list。
ps
这里需要注意的是,在清空list的时候不要使用clear()方法,因为虽然clear()方法是在list添加到res集合之后再次使用的,但是list索引还是指向那个添加到元素,这样使用clear()之后还是会将集合当中的元素清空,这里可以采用要么使用一个中间列表来存储list的值,或者重建一个集合。

算法实现:

class Solution {
    public List<List<Integer> > findContinuousSequence(int sum) {
       //定义两个指针,整数序列不包括0
       int slow = 1;
       int fast = 2;
       //定义一个链表用来存储元素
       List<List<Integer>> list = new ArrayList<>();
       //定义一个链表用来存储满足条件的结果序列
       List<Integer> list2 = new ArrayList<>();
       int per = 0;
       while(fast<=sum){
           list2.add(slow);
           per = slow;
           while(per+fast<sum){
               list2.add(fast);
               //之前的累加和
               per = per+fast;
               //fast指针下移动一位
               fast++;
           }
           if(per+fast==sum){
               //则把增加后的fast也加进去
               list2.add(fast);
               //如果满足条件那么就将当前满足条件的序列加入到结果当中
               list.add(list2);
               //找到结果后重新更新快慢指针
               slow = slow+1;
               fast = slow+1;
               list2 = new ArrayList<>();
           }else{
               //加上最后一个fast指针不满足,重新更新
               slow = slow+1;
               fast = slow+1;
               list2 = new ArrayList<>();
           }
       }
    //   for(List<Integer> num:list){
    //       System.out.println(num);
    //   }
       return list;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值