【LeetCode】面试题57 - II. 和为s的连续正数序列

题目链接:

面试题57 - II. 和为s的连续正数序列

题目描述:

输入一个正整数 target,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。(1 <= target <= 10^5

示例:

示例 1:

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

示例 2:

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

思路:

此题可考虑用滑动窗口解决。

leftright 分别表示窗口的左右边界,从 leftright 的序列和记为 sum

  • 如果 sum < target,则将右边界 right 右移,增大窗口囊括更多的元素以增大 sum
  • 如果 sum > target,则将左边界 left 右移,缩小窗口减少序列中的元素以减小 sum
  • 如果 sum == target,则此时的序列就是所求。

注意:窗口的左边界和右边界永远只能向右移动。
另外,左边界 left 移动到目标值 target 的一半处即可停止,因为当 left 移动到 target / 2 时,最小的序列和也大于 target 了,之后不会再有满足条件的。

代码实现:

class Solution {
    public int[][] findContinuousSequence(int target) {
        // 左边界,右边界
        int left = 1, right = 2;
        // 序列和
        int sum = left + right;
        // 存放结果
        List<int[]> result = new ArrayList<>();

        while (left <= target / 2 && left < right) {
            if (sum < target) {
                // 序列和小于目标值
                right ++;
                sum += right;
            } else if (sum > target) {
                // 序列和大于目标值
                sum -= left;
                left ++;
            } else {
                // 序列和等于目标值
                int[] arr = new int[right - left + 1];
                for (int i = left; i <= right; i++) {
                    arr[i - left] = i;
                }
                result.add(arr);
                sum -= left;
                left ++;
            }
        }
        return result.toArray(new int[result.size()][]);
    }
}

因为题目中已说明 target 是正整数序列和,且至少包含两个数,所以 target 至少是 3。

全部评论

相关推荐

11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务