【双指针】 offer 57-2 和为s的连续正数序列

题目

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:

输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:

输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]

思路

  1. 集合转成数组的两种方法
    • Object[] obj = arr.toArray();//第一种方法
      // int [][]cures = new int [list.size()][];
      cures = (int[][]) list.toArray();
    • String[] obj1 = arr.toArray(new String[3]);//第二种方法
      // return list.toArray(new int[list.size()][]);
  2. 双指针 。利用等差数列求出两个数字之间的和。和相等时就记录结果,否则依据是过大还是过小,进行移动指针

代码

    public int[][] findContinuousSequence(int target) {
        if(target<=0) return null;
        ArrayList<int[]> list = new ArrayList<>();
        int l = 1;
        int r = 2;
        //左指针不会超过一半部分,因为超过一半不会有两个数和等于目标值,题目也不允许输出单个值
        while(l<=target/2){
            int sum = (l + r) * (r - l + 1) >> 1;
            if(sum==target){
                int []res = new int[r-l+1];
                //注意这个数组填入
                for(int i = l;i<=r;i++){
                    res[i-l] = i;
                }
                list.add(res);
                r++;
            }else if(sum<target){
                r = r+1;

            }else {
                l = l+1;

            }
        }
        //注意结果的转化
        return list.toArray(new int[list.size()][]);

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值