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

思路分析
解法一:滑动窗口(推荐)
核心思路:
- 使用双指针维护当前连续正整数区间
[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. 和相同的二元子数组 | 中等 | 双指针 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!