Skip to content

Commit bbc933b

Browse files
committedFeb 4, 2023
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
}
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
1-
func findContinuousSequence(target int) [][]int {
2-
ans := make([][]int, 0)
3-
window := 0
4-
left, right := 1, 1
5-
for n := target / 2; left <= n; {
6-
if window < target {
7-
window += right
8-
right++
9-
} else if window > target {
10-
window -= left
11-
left++
12-
} else {
13-
tmp := make([]int, 0, right-left)
14-
for i := left; i < right; i++ {
15-
tmp = append(tmp, i)
1+
func findContinuousSequence(target int) (ans [][]int) {
2+
l, r := 1, 2
3+
for l < r {
4+
s := (l + r) * (r - l + 1) / 2
5+
if s == target {
6+
t := make([]int, r-l+1)
7+
for i := range t {
8+
t[i] = l + i
169
}
17-
ans = append(ans, tmp)
18-
window -= left
19-
left++
10+
ans = append(ans, t)
11+
l++
12+
} else if s < target {
13+
r++
14+
} else {
15+
l++
2016
}
2117
}
22-
return ans
23-
}
18+
return
19+
}
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
11
class Solution {
22
public int[][] findContinuousSequence(int target) {
3-
List<int[]> list = new ArrayList<>();
4-
int p = 1, q = 2;
5-
while (p < q) {
6-
int s = (p + q) * (q - p + 1) >> 1;
3+
int l = 1, r = 2;
4+
List<int[]> ans = new ArrayList<>();
5+
while (l < r) {
6+
int s = (l + r) * (r - l + 1) / 2;
77
if (s == target) {
8-
int[] t = new int[q - p + 1];
9-
for (int i = 0; i < t.length; ++i) {
10-
t[i] = p + i;
8+
int[] t = new int[r - l + 1];
9+
for (int i = l; i <= r; ++i) {
10+
t[i - l] = i;
1111
}
12-
list.add(t);
13-
++p;
12+
ans.add(t);
13+
++l;
1414
} else if (s < target) {
15-
++q;
15+
++r;
1616
} else {
17-
++p;
17+
++l;
1818
}
1919
}
20-
int[][] res = new int[list.size()][];
21-
for (int i = 0; i < res.length; ++i) {
22-
res[i] = list.get(i);
23-
}
24-
return res;
20+
return ans.toArray(new int[0][]);
2521
}
2622
}

‎lcof/面试题57 - II. 和为s的连续正数序列/Solution.js

+16-19
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,23 @@
33
* @return {number[][]}
44
*/
55
var findContinuousSequence = function (target) {
6-
let res = [];
7-
let window = [];
8-
let i = 1;
9-
let sum = 0;
10-
while (1) {
11-
if (sum < target) {
12-
window.push(i);
13-
sum += i;
14-
i++;
15-
} else if (sum > target) {
16-
let a = window.shift();
17-
if (window.length < 2) break;
18-
sum -= a;
6+
const ans = [];
7+
let l = 1;
8+
let r = 2;
9+
while (l < r) {
10+
const s = ((l + r) * (r - l + 1)) >> 1;
11+
if (s == target) {
12+
const t = [];
13+
for (let i = l; i <= r; ++i) {
14+
t.push(i);
15+
}
16+
ans.push(t);
17+
++l;
18+
} else if (s < target) {
19+
++r;
1920
} else {
20-
res.push([...window]);
21-
window.push(i);
22-
sum += i;
23-
i++;
24-
if (window.length === 2) break;
21+
++l;
2522
}
2623
}
27-
return res;
24+
return ans;
2825
};
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
class Solution:
22
def findContinuousSequence(self, target: int) -> List[List[int]]:
3-
res = []
4-
p, q = 1, 2
5-
while p < q:
6-
s = (p + q) * (q - p + 1) >> 1
3+
l, r = 1, 2
4+
ans = []
5+
while l < r:
6+
s = (l + r) * (r - l + 1) // 2
77
if s == target:
8-
res.append([i for i in range(p, q + 1)])
9-
p += 1
8+
ans.append(list(range(l, r + 1)))
9+
l += 1
1010
elif s < target:
11-
q += 1
11+
r += 1
1212
else:
13-
p += 1
14-
return res
13+
l += 1
14+
return ans

‎lcof/面试题57. 和为s的两个数字/README.md

+46-166
Original file line numberDiff line numberDiff line change
@@ -27,115 +27,45 @@
2727
<li><code>1 &lt;= nums[i]&nbsp;&lt;= 10<sup>6</sup></code></li>
2828
</ul>
2929

30-
## 解法
30+
**方法一:双指针**
3131

32-
**哈希表**
32+
我们用双指针 $l$ 和 $r$ 分别指向数组的左右两端,然后不断移动指针,直到找到一组和为 $target$ 的连续正整数序列。
3333

34-
遍历数组,查看哈希表中是否存在对应的差值(`target` - 遍历元素):
35-
36-
- 存在,即 `return` 返回。
37-
- 不存在,记录元素,继续遍历。
38-
39-
_复杂度_
40-
41-
- 时间 **_O(N)_**
42-
- 空间 **_O(N)_**
43-
44-
**双指针**
45-
46-
1. 声明头尾指针(数组的左右两端)。
47-
2. 将头尾指针所指向的元素相加,与 `target` 比较:
48-
- 大于:尾指针前移。
49-
- 小于:头指针后移。
50-
- 等于:返回两个元素即可。
51-
3. 重复步骤 2,直到等于为止。
52-
53-
> 因为数组是有序的,指针变动对值的影响可预测。
54-
55-
_复杂度_
56-
57-
- 时间 **_O(N)_**
58-
- 空间 **_O(1)_**
59-
60-
```txt
61-
TWO-SUM(A,t)
62-
l = 0
63-
r = A.length - 1
64-
while A[l] + A[r] != t
65-
if A[l] + A[r] < t
66-
l = l + 1
67-
else r = r - 1
68-
return [A[l], A[r]]
69-
```
34+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
7035

7136
<!-- tabs:start -->
7237

7338
### **Python3**
7439

75-
哈希表:
76-
77-
```python
78-
class Solution:
79-
def twoSum(self, nums: List[int], target: int) -> List[int]:
80-
s = set()
81-
for num in nums:
82-
if target - num in s:
83-
return [num, target - num]
84-
s.add(num)
85-
```
86-
87-
双指针:
88-
8940
```python
9041
class Solution:
9142
def twoSum(self, nums: List[int], target: int) -> List[int]:
92-
p, q = 0, len(nums) - 1
93-
while p < q:
94-
s = nums[p] + nums[q]
95-
if s == target:
96-
return [nums[p], nums[q]]
97-
if s < target:
98-
p += 1
43+
l, r = 0, len(nums) - 1
44+
while l < r:
45+
if nums[l] + nums[r] == target:
46+
return [nums[l], nums[r]]
47+
if nums[l] + nums[r] > target:
48+
r -= 1
9949
else:
100-
q -= 1
50+
l += 1
10151
```
10252

10353
### **Java**
10454

105-
哈希表:
106-
107-
```java
108-
class Solution {
109-
public int[] twoSum(int[] nums, int target) {
110-
Set<Integer> s = new HashSet<>();
111-
for (int num : nums) {
112-
if (s.contains(target - num)) {
113-
return new int[]{num, target - num};
114-
}
115-
s.add(num);
116-
}
117-
return null;
118-
}
119-
}
120-
```
121-
122-
双指针:
123-
12455
```java
12556
class Solution {
12657
public int[] twoSum(int[] nums, int target) {
127-
for (int p = 0, q = nums.length - 1; p < q;) {
128-
int s = nums[p] + nums[q];
129-
if (s == target) {
130-
return new int[] {nums[p], nums[q]};
58+
int l = 0, r = nums.length - 1;
59+
while (true) {
60+
if (nums[l] + nums[r] == target) {
61+
return new int[] {nums[l], nums[r]};
13162
}
132-
if (s < target) {
133-
++p;
63+
if (nums[l] + nums[r] > target) {
64+
--r;
13465
} else {
135-
--q;
66+
++l;
13667
}
13768
}
138-
return null;
13969
}
14070
}
14171
```
@@ -146,18 +76,17 @@ class Solution {
14676
class Solution {
14777
public:
14878
vector<int> twoSum(vector<int>& nums, int target) {
149-
for (int p = 0, q = nums.size() - 1; p < q;) {
150-
int s = nums[p] + nums[q];
151-
if (s == target) {
152-
return vector<int> {nums[p], nums[q]};
79+
int l = 0, r = nums.size() - 1;
80+
while (1) {
81+
if (nums[l] + nums[r] == target) {
82+
return {nums[l], nums[r]};
15383
}
154-
if (s < target) {
155-
++p;
84+
if (nums[l] + nums[r] > target) {
85+
--r;
15686
} else {
157-
--q;
87+
++l;
15888
}
15989
}
160-
return vector<int> {};
16190
}
16291
};
16392
```
@@ -166,18 +95,17 @@ public:
16695
16796
```go
16897
func twoSum(nums []int, target int) []int {
169-
for p, q := 0, len(nums)-1; p < q; {
170-
s := nums[p] + nums[q]
171-
if s == target {
172-
return []int{nums[p], nums[q]}
98+
l, r := 0, len(nums)-1
99+
for {
100+
if nums[l]+nums[r] == target {
101+
return []int{nums[l], nums[r]}
173102
}
174-
if s < target {
175-
p++
103+
if nums[l]+nums[r] > target {
104+
r--
176105
} else {
177-
q--
106+
l++
178107
}
179108
}
180-
return nil
181109
}
182110
```
183111

@@ -190,39 +118,23 @@ func twoSum(nums []int, target int) []int {
190118
* @return {number[]}
191119
*/
192120
var twoSum = function (nums, target) {
193-
for (let p = 0, q = nums.length; p < q; ) {
194-
const s = nums[p] + nums[q];
195-
if (s == target) {
196-
return [nums[p], nums[q]];
121+
let l = 0;
122+
let r = nums.length - 1;
123+
while (1) {
124+
if (nums[l] + nums[r] == target) {
125+
return [nums[l], nums[r]];
197126
}
198-
if (s < target) {
199-
++p;
127+
if (nums[l] + nums[r] > target) {
128+
--r;
200129
} else {
201-
--q;
130+
++l;
202131
}
203132
}
204133
};
205134
```
206135

207136
### **TypeScript**
208137

209-
哈希表:
210-
211-
```ts
212-
function twoSum(nums: number[], target: number): number[] {
213-
const set = new Set();
214-
for (const num of nums) {
215-
if (set.has(target - num)) {
216-
return [target - num, num];
217-
}
218-
set.add(num);
219-
}
220-
return null;
221-
}
222-
```
223-
224-
双指针:
225-
226138
```ts
227139
function twoSum(nums: number[], target: number): number[] {
228140
let l = 0;
@@ -240,8 +152,6 @@ function twoSum(nums: number[], target: number): number[] {
240152

241153
### **Rust**
242154

243-
双指针:
244-
245155
```rust
246156
use std::cmp::Ordering;
247157

@@ -260,52 +170,22 @@ impl Solution {
260170
}
261171
```
262172

263-
二分查找:
264-
265-
```rust
266-
use std::cmp::Ordering;
267-
268-
impl Solution {
269-
pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
270-
let n = nums.len() - 1;
271-
let mut l: usize = 0;
272-
let mut r: usize = n;
273-
for i in 0..n {
274-
l = i + 1;
275-
r = n;
276-
let target = target - nums[i];
277-
while l <= r {
278-
let mid = l + r >> 1;
279-
match target.cmp(&nums[mid]) {
280-
Ordering::Less => r = mid - 1,
281-
Ordering::Greater => l = mid + 1,
282-
Ordering::Equal => return vec![nums[i], nums[mid]],
283-
}
284-
}
285-
}
286-
vec![nums[l], nums[r]]
287-
}
288-
}
289-
```
290-
291173
### **C#**
292174

293175
```cs
294176
public class Solution {
295177
public int[] TwoSum(int[] nums, int target) {
296-
int p = 0, q = nums.Length - 1;
297-
while (p < q) {
298-
int s = nums[p] + nums[q];
299-
if (s == target) {
300-
return new int[]{nums[p], nums[q]};
178+
int l = 0, r = nums.Length - 1;
179+
while (true) {
180+
if (nums[l] + nums[r] == target) {
181+
return new int[] {nums[l], nums[r]};
301182
}
302-
if (s < target) {
303-
p += 1;
183+
if (nums[l] + nums[r] > target) {
184+
--r;
304185
} else {
305-
q -= 1;
186+
++l;
306187
}
307188
}
308-
return new int[]{};
309189
}
310190
}
311191
```
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
class Solution {
22
public:
33
vector<int> twoSum(vector<int>& nums, int target) {
4-
for (int p = 0, q = nums.size() - 1; p < q;) {
5-
int s = nums[p] + nums[q];
6-
if (s == target) {
7-
return vector<int>{nums[p], nums[q]};
4+
int l = 0, r = nums.size() - 1;
5+
while (1) {
6+
if (nums[l] + nums[r] == target) {
7+
return {nums[l], nums[r]};
88
}
9-
if (s < target) {
10-
++p;
9+
if (nums[l] + nums[r] > target) {
10+
--r;
1111
} else {
12-
--q;
12+
++l;
1313
}
1414
}
15-
return vector<int>{};
1615
}
1716
};
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
public class Solution {
22
public int[] TwoSum(int[] nums, int target) {
3-
int p = 0, q = nums.Length - 1;
4-
while (p < q) {
5-
int s = nums[p] + nums[q];
6-
if (s == target) {
7-
return new int[]{nums[p], nums[q]};
3+
int l = 0, r = nums.Length - 1;
4+
while (true) {
5+
if (nums[l] + nums[r] == target) {
6+
return new int[] {nums[l], nums[r]};
87
}
9-
if (s < target) {
10-
p += 1;
8+
if (nums[l] + nums[r] > target) {
9+
--r;
1110
} else {
12-
q -= 1;
11+
++l;
1312
}
1413
}
15-
return new int[]{};
1614
}
1715
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
func twoSum(nums []int, target int) []int {
2-
for p, q := 0, len(nums)-1; p < q; {
3-
s := nums[p] + nums[q]
4-
if s == target {
5-
return []int{nums[p], nums[q]}
2+
l, r := 0, len(nums)-1
3+
for {
4+
if nums[l]+nums[r] == target {
5+
return []int{nums[l], nums[r]}
66
}
7-
if s < target {
8-
p++
7+
if nums[l]+nums[r] > target {
8+
r--
99
} else {
10-
q--
10+
l++
1111
}
1212
}
13-
return nil
1413
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
class Solution {
22
public int[] twoSum(int[] nums, int target) {
3-
for (int p = 0, q = nums.length - 1; p < q;) {
4-
int s = nums[p] + nums[q];
5-
if (s == target) {
6-
return new int[] {nums[p], nums[q]};
3+
int l = 0, r = nums.length - 1;
4+
while (true) {
5+
if (nums[l] + nums[r] == target) {
6+
return new int[] {nums[l], nums[r]};
77
}
8-
if (s < target) {
9-
++p;
8+
if (nums[l] + nums[r] > target) {
9+
--r;
1010
} else {
11-
--q;
11+
++l;
1212
}
1313
}
14-
return null;
1514
}
1615
}

‎lcof/面试题57. 和为s的两个数字/Solution.js

+9-8
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@
44
* @return {number[]}
55
*/
66
var twoSum = function (nums, target) {
7-
for (let p = 0, q = nums.length; p < q; ) {
8-
const s = nums[p] + nums[q];
9-
if (s == target) {
10-
return [nums[p], nums[q]];
7+
let l = 0;
8+
let r = nums.length - 1;
9+
while (1) {
10+
if (nums[l] + nums[r] == target) {
11+
return [nums[l], nums[r]];
1112
}
12-
if (s < target) {
13-
++p;
13+
if (nums[l] + nums[r] > target) {
14+
--r;
1415
} else {
15-
--q;
16+
++l;
1617
}
1718
}
18-
};
19+
};
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
class Solution:
22
def twoSum(self, nums: List[int], target: int) -> List[int]:
3-
p, q = 0, len(nums) - 1
4-
while p < q:
5-
s = nums[p] + nums[q]
6-
if s == target:
7-
return [nums[p], nums[q]]
8-
if s < target:
9-
p += 1
3+
l, r = 0, len(nums) - 1
4+
while l < r:
5+
if nums[l] + nums[r] == target:
6+
return [nums[l], nums[r]]
7+
if nums[l] + nums[r] > target:
8+
r -= 1
109
else:
11-
q -= 1
10+
l += 1

0 commit comments

Comments
 (0)
Please sign in to comment.