LeetCode 剑指 Offer 57 - II. 和为s的连续正数序列

题目描述

剑指 Offer 57 - II. 和为s的连续正数序列

image-20241107212159667

思路分析

解法一:滑动窗口(推荐)

核心思路

  • 使用双指针维护当前连续正整数区间 [left, right] 与其和。
  • 若和小于目标,扩展右端;若和大于目标,收缩左端。
  • 相等时记录并继续移动左端寻找下一个解。


复杂度分析

  • 时间复杂度:O(n),其中 n 表示目标值 target
  • 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
    public int[][] findContinuousSequence(int target) {
        List<int[]> res = new ArrayList<>();
        int left = 1;
        int right = 2;
        int sum = left + right;

        // 滑动窗口维护连续区间
        while (left < right) {
            if (sum == target) {
                res.add(build(left, right));
                sum -= left;
                left++;
            } else if (sum < target) {
                right++;
                sum += right;
            } else {
                sum -= left;
                left++;
            }
        }

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

    private int[] build(int left, int right) {
        int[] arr = new int[right - left + 1];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = left + i;
        }
        return arr;
    }
}
func findContinuousSequence(target int) [][]int {
	res := make([][]int, 0)
	left, right := 1, 2
	sum := left + right

	// 滑动窗口维护连续区间
	for left < right {
		if sum == target {
			seq := make([]int, right-left+1)
			for i := range seq {
				seq[i] = left + i
			}
			res = append(res, seq)
			sum -= left
			left++
		} else if sum < target {
			right++
			sum += right
		} else {
			sum -= left
			left++
		}
	}

	return res
}

相似题目

题目 难度 考察点
209. 长度最小的子数组 中等 滑动窗口
713. 乘积小于 K 的子数组 中等 滑动窗口
560. 和为 K 的子数组 中等 前缀和
15. 三数之和 中等 双指针
930. 和相同的二元子数组 中等 双指针
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/60890574
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!