【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。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
2950次浏览 42人参与
# HR最不可信的一句话是__ #
985次浏览 32人参与
# 巨人网络春招 #
11477次浏览 224人参与
# 春招至今,你的战绩如何? #
14489次浏览 135人参与
# AI面会问哪些问题? #
874次浏览 21人参与
# 你的实习产出是真实的还是包装的? #
2588次浏览 52人参与
# MiniMax求职进展汇总 #
24830次浏览 321人参与
# 沪漂/北漂你觉得哪个更苦? #
1076次浏览 29人参与
# 你做过最难的笔试是哪家公司 #
1084次浏览 20人参与
# AI时代,哪个岗位还有“活路” #
2630次浏览 49人参与
# XX请雇我工作 #
51141次浏览 171人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7950次浏览 43人参与
# 简历第一个项目做什么 #
32035次浏览 357人参与
# 简历中的项目经历要怎么写? #
310850次浏览 4257人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152795次浏览 888人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187527次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64483次浏览 860人参与
# 如果重来一次你还会读研吗 #
229960次浏览 2011人参与
# 投格力的你,拿到offer了吗? #
178175次浏览 889人参与
# 你怎么看待AI面试 #
180611次浏览 1291人参与
# 正在春招的你,也参与了去年秋招吗? #
364105次浏览 2640人参与
# 腾讯音乐求职进展汇总 #
160808次浏览 1114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务