Skip to content

Commit a18ff6d

Browse files
committed
feat: add solutions to lcof problem: No.57. Two Sum
1 parent 7fa9085 commit a18ff6d

File tree

7 files changed

+142
-39
lines changed

7 files changed

+142
-39
lines changed

README.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
## 介绍
1616

17-
本项目包含 [LeetCode](https://leetcode-cn.com/problemset/all/)[《剑指 Offer(第 2 版)》](https://leetcode-cn.com/problemset/lcof/)[《程序员面试金典(第 6 版)》](https://leetcode-cn.com/problemset/lcci/)等题目的相关题解。所有题解均由多种编程语言实现,包括但不限于:Java、Python、C++、JavaScript、C#、Go,日常更新。欢迎 Star 🌟 关注本项目「[GitHub](https://github.com/doocs/leetcode) / [Gitee](https://gitee.com/doocs/leetcode)」,获取项目最新动态。
17+
本项目包含 LeetCode《剑指 Offer(第 2 版)》《程序员面试金典(第 6 版)》等题目的相关题解。所有题解均由多种编程语言实现,包括但不限于:Java、Python、C++、JavaScript、C#、Go,日常更新。欢迎 Star 🌟 关注本项目「[GitHub](https://github.com/doocs/leetcode) / [Gitee](https://gitee.com/doocs/leetcode)」,获取项目最新动态。
1818

1919
[English Version](./README_EN.md)
2020

@@ -213,7 +213,6 @@
213213
- [Yang Libin](https://github.com/yanglbme)
214214
- [Mao Longlong](https://github.com/MaoLongLong)
215215

216-
217216
## 加入我们
218217

219218
刷编程题的最大好处就是可以锻炼解决问题的思维能力。相信我,「如何去思考」​ 本身也是一项需要不断学习和练习的技能。非常感谢前微软工程师、现蚂蚁金服技术专家 [@kfstorm](https://github.com/kfstorm) 贡献了本项目的所有 [C# 题解](https://github.com/doocs/leetcode/pull/245)
@@ -257,4 +256,4 @@
257256

258257
## 许可证
259258

260-
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">知识共享 版权归属-相同方式共享 4.0 国际 公共许可证</a>
259+
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">知识共享 版权归属-相同方式共享 4.0 国际 公共许可证</a>

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

+92-17
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,28 @@
2525

2626
## 解法
2727

28+
哈希表或双指针实现。时间复杂度均为 `O(n)`
29+
30+
哈希表空间复杂度 `O(n)`,双指针则是 `O(1)`
31+
2832
<!-- tabs:start -->
2933

3034
### **Python3**
3135

36+
哈希表:
37+
38+
```python
39+
class Solution:
40+
def twoSum(self, nums: List[int], target: int) -> List[int]:
41+
s = set()
42+
for num in nums:
43+
if target - num in s:
44+
return [num, target - num]
45+
s.add(num)
46+
```
47+
48+
双指针:
49+
3250
```python
3351
class Solution:
3452
def twoSum(self, nums: List[int], target: int) -> List[int]:
@@ -41,31 +59,89 @@ class Solution:
4159
p += 1
4260
else:
4361
q -= 1
44-
4562
```
4663

4764
### **Java**
4865

66+
哈希表:
67+
68+
```java
69+
class Solution {
70+
public int[] twoSum(int[] nums, int target) {
71+
Set<Integer> s = new HashSet<>();
72+
for (int num : nums) {
73+
if (s.contains(target - num)) {
74+
return new int[]{num, target - num};
75+
}
76+
s.add(num);
77+
}
78+
return null;
79+
}
80+
}
81+
```
82+
83+
双指针:
84+
4985
```java
5086
class Solution {
5187
public int[] twoSum(int[] nums, int target) {
52-
int p = 0, q = nums.length - 1;
53-
while (p < q) {
88+
for (int p = 0, q = nums.length - 1; p < q;) {
5489
int s = nums[p] + nums[q];
5590
if (s == target) {
56-
return new int[] {nums[p], nums[q]};
91+
return new int[]{nums[p], nums[q]};
5792
}
5893
if (s < target) {
5994
++p;
6095
} else {
6196
--q;
6297
}
6398
}
64-
return new int[]{0};
99+
return null;
65100
}
66101
}
67102
```
68103

104+
### **C++**
105+
106+
```cpp
107+
class Solution {
108+
public:
109+
vector<int> twoSum(vector<int>& nums, int target) {
110+
for (int p = 0, q = nums.size() - 1; p < q;) {
111+
int s = nums[p] + nums[q];
112+
if (s == target) {
113+
return vector<int>{nums[p], nums[q]};
114+
}
115+
if (s < target) {
116+
++p;
117+
} else {
118+
--q;
119+
}
120+
}
121+
return vector<int>{};
122+
}
123+
};
124+
```
125+
126+
### **Go**
127+
128+
```go
129+
func twoSum(nums []int, target int) []int {
130+
for p, q := 0, len(nums)-1; p < q; {
131+
s := nums[p] + nums[q]
132+
if s == target {
133+
return []int{nums[p], nums[q]}
134+
}
135+
if s < target {
136+
p++
137+
} else {
138+
q--
139+
}
140+
}
141+
return nil
142+
}
143+
```
144+
69145
### **JavaScript**
70146

71147
```js
@@ -74,19 +150,18 @@ class Solution {
74150
* @param {number} target
75151
* @return {number[]}
76152
*/
77-
var twoSum = function (nums, target) {
78-
let left = 0;
79-
let right = nums.length - 1;
80-
while (left < right) {
81-
let sum = nums[left] + nums[right];
82-
if (sum === target) {
83-
return [nums[left], nums[right]];
84-
} else if (sum > target) {
85-
right--;
86-
} else {
87-
left++;
153+
var twoSum = function(nums, target) {
154+
for (let p = 0, q = nums.length; p < q;) {
155+
const s = nums[p] + nums[q];
156+
if (s == target) {
157+
return [nums[p], nums[q]];
158+
}
159+
if (s < target) {
160+
++p;
161+
} else {
162+
--q;
163+
}
88164
}
89-
}
90165
};
91166
```
92167

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
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]};
8+
}
9+
if (s < target) {
10+
++p;
11+
} else {
12+
--q;
13+
}
14+
}
15+
return vector<int>{};
16+
}
17+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
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]}
6+
}
7+
if s < target {
8+
p++
9+
} else {
10+
q--
11+
}
12+
}
13+
return nil
14+
}
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
class Solution {
22
public int[] twoSum(int[] nums, int target) {
3-
int p = 0, q = nums.length - 1;
4-
while (p < q) {
3+
for (int p = 0, q = nums.length - 1; p < q;) {
54
int s = nums[p] + nums[q];
65
if (s == target) {
7-
return new int[] {nums[p], nums[q]};
6+
return new int[]{nums[p], nums[q]};
87
}
98
if (s < target) {
109
++p;
1110
} else {
1211
--q;
1312
}
1413
}
15-
return new int[]{0};
14+
return null;
1615
}
1716
}

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

+12-13
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,16 @@
33
* @param {number} target
44
* @return {number[]}
55
*/
6-
var twoSum = function (nums, target) {
7-
let left = 0;
8-
let right = nums.length - 1;
9-
while (left < right) {
10-
let sum = nums[left] + nums[right];
11-
if (sum === target) {
12-
return [nums[left], nums[right]];
13-
} else if (sum > target) {
14-
right--;
15-
} else {
16-
left++;
17-
}
6+
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]];
11+
}
12+
if (s < target) {
13+
++p;
14+
} else {
15+
--q;
16+
}
1817
}
19-
};
18+
};

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ def twoSum(self, nums: List[int], target: int) -> List[int]:
55
s = nums[p] + nums[q]
66
if s == target:
77
return [nums[p], nums[q]]
8-
if s < target:
8+
if s < target:
99
p += 1
10-
else:
10+
else:
1111
q -= 1

0 commit comments

Comments
 (0)