面试题57 - II. 和为s的连续正数序列(Java)(快慢指针,滑动窗口)(数组链表)

13 篇文章 0 订阅
3 篇文章 0 订阅

1 题目

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

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

示例 1:

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

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

限制:

1 <= target <= 10^5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2 Java

2.1 !方法一(快慢指针,滑动窗口,数组链表)

总和sum小于目标target,右指针右移
总和sum大于目标target,左指针右移(重点!!!)
总和sum等于目标target,记录结果,左指针右移

注意答案记录在 LinkedList<int[]> 类型的list中
且最后将list转化为数组的操作,没太搞懂

class Solution {
    public int[][] findContinuousSequence(int target) {
        LinkedList<int[]> list = new LinkedList<>();
        
        int l = 1, r = 1, sum = 0;
        while(l <= target / 2){
            if(sum < target)    sum += (r++);
            else if(sum > target)   sum -= (l++);
            else{
                int[] a = new int[r - l];
                for(int i = l; i < r; i++) a[i - l] = i;
                list.add(a);

                sum -= (l++);
            }
        }

        return list.toArray(new int[list.size()][]);
    }
}

2.2 方法二(快慢指针,滑动窗口,嵌套集合)

注意:
集合的深拷贝
二维数组分维度初始化
嵌套集合转二维数组

class Solution {
    public int[][] findContinuousSequence(int target) {
        List<List<Integer>> listList = new ArrayList<>();
        List<Integer> list = new ArrayList<>();

        int l = 1, r = 1, sum = 0;
        while(l <= target / 2){             // !!!注意是<=,不是<,比如target=9,则target/2=4,所以必须有=
            if(sum < target)    sum += (r++);
            else if(sum > target)   sum -= (l++);
            else{
                for(int i = l; i < r; i++)  list.add(i);
                listList.add(new ArrayList<Integer>(list)); // 深拷贝
                list.clear();                               // 记得清除list

                sum -= (l++);   // !!!易忘,左端向右挪,找下一个符合要求的集合
            }
        }

        int m = listList.size();
        int[][] ans = new int[m][];
        for(int i = 0; i < m; i++){
            int n = listList.get(i).size();
            // ans = new int[m][n];     !!!易错
            ans[i] = new int[n];
            for(int j = 0; j < n; j++)  ans[i][j] = listList.get(i).get(j);
        }

        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值