Skip to content

Commit bbc933b

Browse files
committed
feat: add solutions to lcof problems: No.57,57.2
1 parent 595d6c4 commit bbc933b

File tree

14 files changed

+266
-455
lines changed

14 files changed

+266
-455
lines changed

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

+97-127
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,11 @@
3636

3737
## 解法
3838

39-
双指针:`p = 1``q = 2`
39+
**方法一:双指针**
40+
41+
我们可以使用双指针的方法,维护一个区间 $[l,.. r]$,使得区间内的数之和 $s$ 为 target,如果区间内的数之和小于 target,则右指针 $l$ 右移,如果区间内的数之和大于 target,则左指针 $l$ 右移,直到左指针到达 target 的一半为止。
42+
43+
时间复杂度 $O(target)$,忽略答案的空间消耗,空间复杂度 $O(1)$。
4044

4145
<!-- tabs:start -->
4246

@@ -45,184 +49,150 @@
4549
```python
4650
class Solution:
4751
def findContinuousSequence(self, target: int) -> List[List[int]]:
48-
res = []
49-
p, q = 1, 2
50-
while p < q:
51-
s = (p + q) * (q - p + 1) >> 1
52+
l, r = 1, 2
53+
ans = []
54+
while l < r:
55+
s = (l + r) * (r - l + 1) // 2
5256
if s == target:
53-
res.append([i for i in range(p, q + 1)])
54-
p += 1
57+
ans.append(list(range(l, r + 1)))
58+
l += 1
5559
elif s < target:
56-
q += 1
60+
r += 1
5761
else:
58-
p += 1
59-
return res
62+
l += 1
63+
return ans
6064
```
6165

6266
### **Java**
6367

6468
```java
6569
class Solution {
6670
public int[][] findContinuousSequence(int target) {
67-
List<int[]> list = new ArrayList<>();
68-
int p = 1, q = 2;
69-
while (p < q) {
70-
int s = (p + q) * (q - p + 1) >> 1;
71+
int l = 1, r = 2;
72+
List<int[]> ans = new ArrayList<>();
73+
while (l < r) {
74+
int s = (l + r) * (r - l + 1) / 2;
7175
if (s == target) {
72-
int[] t = new int[q - p + 1];
73-
for (int i = 0; i < t.length; ++i) {
74-
t[i] = p + i;
76+
int[] t = new int[r - l + 1];
77+
for (int i = l; i <= r; ++i) {
78+
t[i - l] = i;
7579
}
76-
list.add(t);
77-
++p;
80+
ans.add(t);
81+
++l;
7882
} else if (s < target) {
79-
++q;
83+
++r;
8084
} else {
81-
++p;
85+
++l;
8286
}
8387
}
84-
int[][] res = new int[list.size()][];
85-
for (int i = 0; i < res.length; ++i) {
86-
res[i] = list.get(i);
87-
}
88-
return res;
88+
return ans.toArray(new int[0][]);
8989
}
9090
}
9191
```
9292

93-
### **JavaScript**
94-
95-
```js
96-
/**
97-
* @param {number} target
98-
* @return {number[][]}
99-
*/
100-
var findContinuousSequence = function (target) {
101-
let res = [];
102-
let window = [];
103-
let i = 1;
104-
let sum = 0;
105-
while (1) {
106-
if (sum < target) {
107-
window.push(i);
108-
sum += i;
109-
i++;
110-
} else if (sum > target) {
111-
let a = window.shift();
112-
if (window.length < 2) break;
113-
sum -= a;
114-
} else {
115-
res.push([...window]);
116-
window.push(i);
117-
sum += i;
118-
i++;
119-
if (window.length === 2) break;
120-
}
121-
}
122-
return res;
123-
};
124-
```
125-
12693
### **C++**
12794

12895
```cpp
12996
class Solution {
13097
public:
131-
vector<int> build(int small, int big) {
132-
vector<int> ret;
133-
for (int i = small; i <= big; i++) {
134-
ret.push_back(i);
135-
}
136-
137-
return ret;
138-
}
139-
14098
vector<vector<int>> findContinuousSequence(int target) {
141-
vector<vector<int>> ret;
142-
int small = 1;
143-
int big = 2;
144-
int mid = (target + 1) / 2;
145-
int curSum = small + big;
146-
147-
if (target < 3) {
148-
ret;
149-
}
150-
151-
while (small < mid) {
152-
if (curSum == target) {
153-
ret.push_back(build(small, big));
154-
}
155-
156-
while (curSum > target && small < mid) {
157-
// 一直减去,减去到比target小停止
158-
curSum -= small;
159-
small++;
160-
161-
if (curSum == target && small < mid) {
162-
ret.push_back(build(small, big));
163-
}
99+
vector<vector<int>> ans;
100+
int l = 1, r = 2;
101+
while (l < r) {
102+
int s = (l + r) * (r - l + 1) / 2;
103+
if (s == target) {
104+
vector<int> t(r - l + 1);
105+
iota(t.begin(), t.end(), l);
106+
ans.emplace_back(t);
107+
++l;
108+
} else if (s < target) {
109+
++r;
110+
} else {
111+
++l;
164112
}
165-
166-
big++;
167-
curSum += big;
168113
}
169-
170-
return ret;
114+
return ans;
171115
}
172116
};
173117
```
174118
175119
### **Go**
176120
177121
```go
178-
func findContinuousSequence(target int) [][]int {
179-
ans := make([][]int, 0)
180-
window := 0
181-
left, right := 1, 1
182-
for n := target / 2; left <= n; {
183-
if window < target {
184-
window += right
185-
right++
186-
} else if window > target {
187-
window -= left
188-
left++
189-
} else {
190-
tmp := make([]int, 0, right-left)
191-
for i := left; i < right; i++ {
192-
tmp = append(tmp, i)
122+
func findContinuousSequence(target int) (ans [][]int) {
123+
l, r := 1, 2
124+
for l < r {
125+
s := (l + r) * (r - l + 1) / 2
126+
if s == target {
127+
t := make([]int, r-l+1)
128+
for i := range t {
129+
t[i] = l + i
193130
}
194-
ans = append(ans, tmp)
195-
window -= left
196-
left++
131+
ans = append(ans, t)
132+
l++
133+
} else if s < target {
134+
r++
135+
} else {
136+
l++
197137
}
198138
}
199-
return ans
139+
return
200140
}
201141
```
202142

143+
### **JavaScript**
144+
145+
```js
146+
/**
147+
* @param {number} target
148+
* @return {number[][]}
149+
*/
150+
var findContinuousSequence = function (target) {
151+
const ans = [];
152+
let l = 1;
153+
let r = 2;
154+
while (l < r) {
155+
const s = ((l + r) * (r - l + 1)) >> 1;
156+
if (s == target) {
157+
const t = [];
158+
for (let i = l; i <= r; ++i) {
159+
t.push(i);
160+
}
161+
ans.push(t);
162+
++l;
163+
} else if (s < target) {
164+
++r;
165+
} else {
166+
++l;
167+
}
168+
}
169+
return ans;
170+
};
171+
```
172+
203173
### **C#**
204174

205175
```cs
206176
public class Solution {
207177
public int[][] FindContinuousSequence(int target) {
208-
List<int[]> res = new List<int[]>();
209-
int p = 1, q = 2;
210-
while (p < q) {
211-
int s = (p + q) * (q - p + 1) >> 1;
178+
List<int[]> ans = new List<int[]>();
179+
int l = 1, r = 2;
180+
while (l < r) {
181+
int s = (l + r) * (r - l + 1) >> 1;
212182
if (s == target) {
213-
List<int> tmp = new List<int>();
214-
for (int i = p; i < q + 1; i++) {
215-
tmp.Add(i);
183+
List<int> t = new List<int>();
184+
for (int i = l; i <= r; i++) {
185+
t.Add(i);
216186
}
217-
p += 1;
218-
res.Add(tmp.ToArray());
187+
l += 1;
188+
ans.Add(t.ToArray());
219189
} else if (s < target) {
220-
q += 1;
190+
r += 1;
221191
} else {
222-
p += 1;
192+
l += 1;
223193
}
224194
}
225-
return res.ToArray();
195+
return ans.ToArray();
226196
}
227197
}
228198
```
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,21 @@
11
class Solution {
22
public:
3-
vector<int> build(int small, int big) {
4-
vector<int> ret;
5-
for (int i = small; i <= big; i++) {
6-
ret.push_back(i);
7-
}
8-
9-
return ret;
10-
}
11-
123
vector<vector<int>> findContinuousSequence(int target) {
13-
vector<vector<int>> ret;
14-
int small = 1;
15-
int big = 2;
16-
int mid = (target + 1) / 2;
17-
int curSum = small + big;
18-
19-
if (target < 3) {
20-
ret;
21-
}
22-
23-
while (small < mid) {
24-
if (curSum == target) {
25-
ret.push_back(build(small, big));
26-
}
27-
28-
while (curSum > target && small < mid) {
29-
// 一直减去,减去到比target小停止
30-
curSum -= small;
31-
small++;
32-
33-
if (curSum == target && small < mid) {
34-
ret.push_back(build(small, big));
35-
}
4+
vector<vector<int>> ans;
5+
int l = 1, r = 2;
6+
while (l < r) {
7+
int s = (l + r) * (r - l + 1) / 2;
8+
if (s == target) {
9+
vector<int> t(r - l + 1);
10+
iota(t.begin(), t.end(), l);
11+
ans.emplace_back(t);
12+
++l;
13+
} else if (s < target) {
14+
++r;
15+
} else {
16+
++l;
3617
}
37-
38-
big++;
39-
curSum += big;
4018
}
41-
42-
return ret;
19+
return ans;
4320
}
4421
};
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
public class Solution {
22
public int[][] FindContinuousSequence(int target) {
3-
List<int[]> res = new List<int[]>();
4-
int p = 1, q = 2;
5-
while (p < q) {
6-
int s = (p + q) * (q - p + 1) >> 1;
3+
List<int[]> ans = new List<int[]>();
4+
int l = 1, r = 2;
5+
while (l < r) {
6+
int s = (l + r) * (r - l + 1) >> 1;
77
if (s == target) {
8-
List<int> tmp = new List<int>();
9-
for (int i = p; i < q + 1; i++) {
10-
tmp.Add(i);
8+
List<int> t = new List<int>();
9+
for (int i = l; i <= r; i++) {
10+
t.Add(i);
1111
}
12-
p += 1;
13-
res.Add(tmp.ToArray());
12+
l += 1;
13+
ans.Add(t.ToArray());
1414
} else if (s < target) {
15-
q += 1;
15+
r += 1;
1616
} else {
17-
p += 1;
17+
l += 1;
1818
}
1919
}
20-
return res.ToArray();
20+
return ans.ToArray();
2121
}
2222
}

0 commit comments

Comments
 (0)