Skip to content

Commit 860f344

Browse files
author
杨世超
committed
Update 剑指 Offer 57 - II. 和为s的连续正数序列.md
1 parent 144761a commit 860f344

File tree

1 file changed

+54
-4
lines changed

1 file changed

+54
-4
lines changed

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

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,63 @@
55

66
## 题目大意
77

8-
给定一个正整数 `target`
8+
**描述**给定一个正整数 `target`
99

10-
要求:输出所有和为 `target` 的连续正整数序列(至少含有两个数)。序列中的数字由小到大排列,不同序列按照首个数字从小到大排列。
10+
**要求**:输出所有和为 `target` 的连续正整数序列(至少含有两个数)。序列中的数字由小到大排列,不同序列按照首个数字从小到大排列。
11+
12+
**说明**
13+
14+
- $1 \le target \le 10^5$。
15+
16+
**示例**
17+
18+
```Python
19+
输入 target = 9
20+
输出 [[2,3,4],[4,5]]
21+
```
1122

1223
## 解题思路
1324

14-
滑动窗口求解。具体做法如下:
25+
### 思路 1:枚举算法
26+
27+
连续正整数序列中元素的最小值大于等于 `1`,而最大值不会超过 `target`。所以我们可以枚举可行的区间,并计算出区间和,将其与 `target` 进行比较,如果相等则将对应的区间元素加入答案数组中,最终返回答案数组。
28+
29+
因为题目要求至少含有两个数,则序列开始元素不会超过 `target` 的一半,所以序列开始元素可以从 `1` 开始,枚举到 `target // 2` 即可。
30+
31+
具体步骤如下:
32+
33+
- 使用列表变量 `res` 作为答案数组。
34+
- 使用一重循环 `i`,用于枚举序列开始位置,枚举范围为 `[1, target // 2]`
35+
- 使用变量 `cur_sum` 维护当前区间的区间和,`cur_sum` 初始为 `0`
36+
- 使用第 `2` 重循环 `j`,用于枚举序列的结束位置,枚举范围为 `[i, target - 1]`,并累积计算当前区间的区间和,即 `cur_sum += j`
37+
- 如果当前区间的区间和大于 `target`,则跳出循环。
38+
- 如果当前区间的区间和等于 `target`,则将区间上的元素保存为列表,并添加到答案数组中,然后跳出第 `2` 重循环。
39+
- 遍历完返回答案数组。
40+
41+
### 思路 1:代码
42+
43+
```Python
44+
class Solution:
45+
def findContinuousSequence(self, target: int) -> List[List[int]]:
46+
res = []
47+
for i in range(1, target // 2 + 1):
48+
cur_sum = 0
49+
for j in range(i, target):
50+
cur_sum += j
51+
if cur_sum > target:
52+
break
53+
if cur_sum == target:
54+
cur_res = []
55+
for k in range(i, j + 1):
56+
cur_res.append(k)
57+
res.append(cur_res)
58+
break
59+
return res
60+
```
61+
62+
### 思路 2:滑动窗口
63+
64+
具体做法如下:
1565

1666
- 初始化窗口,令 `left = 1``right = 2`
1767
- 计算 `sum = (left + right) * (right - left + 1) // 2`
@@ -20,7 +70,7 @@
2070
- 如果 `sum > target` 时,说明需要缩小窗口,则 `left += 1`
2171
- 直到 `left >= right` 时停止,返回答案数组。
2272

23-
## 代码
73+
### 思路 2:滑动窗口代码
2474

2575
```Python
2676
class Solution:

0 commit comments

Comments
 (0)