57
57
58
58
** 方法一:哈希表**
59
59
60
- 用哈希表 (字典)存放数组值以及对应的下标。
60
+ 我们可以用哈希表 (字典) $d$ 存放数组值以及对应的下标。
61
61
62
- 遍历数组,当发现 ` target - nums[i] ` 在哈希表中,说明找到了目标值。
62
+ 遍历数组 ` nums ` ,当发现 ` target - nums[i] ` 在哈希表中,说明找到了目标值,返回 ` target - nums[i] ` 的下标和 ` i ` 即可 。
63
63
64
64
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 ` nums ` 的长度。
65
65
73
73
class Solution :
74
74
def twoSum (self , nums : List[int ], target : int ) -> List[int ]:
75
75
m = {}
76
- for i, v in enumerate (nums):
77
- x = target - v
78
- if x in m:
79
- return [m[x ], i]
80
- m[v ] = i
76
+ for i, x in enumerate (nums):
77
+ y = target - x
78
+ if y in m:
79
+ return [m[y ], i]
80
+ m[x ] = i
81
81
```
82
82
83
83
### ** Java**
@@ -88,15 +88,14 @@ class Solution:
88
88
class Solution {
89
89
public int [] twoSum (int [] nums , int target ) {
90
90
Map<Integer , Integer > m = new HashMap<> ();
91
- for (int i = 0 ; i < nums . length ; ++ i) {
92
- int v = nums[i];
93
- int x = target - v ;
94
- if (m. containsKey(x )) {
95
- return new int [] {m. get(x ), i};
91
+ for (int i = 0 ; ; ++ i) {
92
+ int x = nums[i];
93
+ int y = target - x ;
94
+ if (m. containsKey(y )) {
95
+ return new int [] {m. get(y ), i};
96
96
}
97
- m. put(v , i);
97
+ m. put(x , i);
98
98
}
99
- return null ;
100
99
}
101
100
}
102
101
```
@@ -108,13 +107,14 @@ class Solution {
108
107
public:
109
108
vector<int > twoSum(vector<int >& nums, int target) {
110
109
unordered_map<int, int> m;
111
- for (int i = 0; i < nums.size(); ++i) {
112
- int v = nums[ i] ;
113
- int x = target - v;
114
- if (m.count(x)) return {m[ x] , i};
115
- m[ v] = i;
110
+ for (int i = 0; ; ++i) {
111
+ int x = nums[ i] ;
112
+ int y = target - x;
113
+ if (m.count(y)) {
114
+ return {m[ y] , i};
115
+ }
116
+ m[ x] = i;
116
117
}
117
- return {};
118
118
}
119
119
};
120
120
```
@@ -124,14 +124,14 @@ public:
124
124
```go
125
125
func twoSum(nums []int, target int) []int {
126
126
m := map[int]int{}
127
- for i, v := range nums {
128
- x := target - v
129
- if j, ok := m[x]; ok {
127
+ for i := 0; ; i++ {
128
+ x := nums[i]
129
+ y := target - x
130
+ if j, ok := m[y]; ok {
130
131
return []int{j, i}
131
132
}
132
- m[v ] = i
133
+ m[x ] = i
133
134
}
134
- return nil
135
135
}
136
136
```
137
137
@@ -145,15 +145,14 @@ func twoSum(nums []int, target int) []int {
145
145
*/
146
146
var twoSum = function (nums , target ) {
147
147
const m = new Map ();
148
- for (let i = 0 ; i < nums . length ; ++ i) {
149
- const v = nums[i];
150
- const x = target - v ;
151
- if (m .has (x )) {
152
- return [m .get (x ), i];
148
+ for (let i = 0 ; ; ++ i) {
149
+ const x = nums[i];
150
+ const y = target - x ;
151
+ if (m .has (y )) {
152
+ return [m .get (y ), i];
153
153
}
154
- m .set (v , i);
154
+ m .set (x , i);
155
155
}
156
- return [];
157
156
};
158
157
```
159
158
@@ -163,22 +162,16 @@ var twoSum = function (nums, target) {
163
162
public class Solution {
164
163
public int [] TwoSum (int [] nums , int target ) {
165
164
var m = new Dictionary <int , int >();
166
- for (var i = 0 ; i < nums .Length ; ++ i )
167
- {
168
- int j ;
169
- int v = nums [i ];
170
- int x = target - v ;
171
- if (m .TryGetValue (x , out j ))
172
- {
165
+ for (int i = 0 , j ; ; ++ i ) {
166
+ int x = nums [i ];
167
+ int y = target - x ;
168
+ if (m .TryGetValue (y , out j )) {
173
169
return new [] {j , i };
174
170
}
175
- if (! m .ContainsKey (v ))
176
- {
177
- m .Add (v , i );
171
+ if (! m .ContainsKey (x )) {
172
+ m .Add (x , i );
178
173
}
179
-
180
174
}
181
- return null ;
182
175
}
183
176
}
184
177
```
@@ -188,42 +181,21 @@ public class Solution {
188
181
``` swift
189
182
class Solution {
190
183
func twoSum (_ nums : [Int ], _ target : Int ) -> [Int ] {
191
- var map = [Int : Int ]()
184
+ var m = [Int : Int ]()
192
185
var i = 0
193
- for num in nums {
194
- map[num] = i
195
- i = i + 1
196
- }
197
- i = 0
198
- for num in nums {
199
- if let otherIndex = map[target - num], otherIndex != i {
200
- return [i, otherIndex]
186
+ while true {
187
+ let x = nums[i]
188
+ let y = target - nums[i]
189
+ if let j = m[target - nums[i]] {
190
+ return [j, i]
201
191
}
202
- i = i + 1
192
+ m[nums[i]] = i
193
+ i += 1
203
194
}
204
- return []
205
195
}
206
196
}
207
197
```
208
198
209
- ### ** Nim**
210
-
211
- ``` nim
212
- import std/enumerate
213
-
214
- proc twoSum(nums: seq[int], target: int): seq[int] =
215
- var
216
- bal: int
217
- tdx: int
218
- for idx, val in enumerate(nums):
219
- bal = target - val
220
- if bal in nums:
221
- tdx = nums.find(bal)
222
- if idx != tdx:
223
- return @[idx, tdx]
224
-
225
- ```
226
-
227
199
### ** Rust**
228
200
229
201
``` rust
@@ -243,6 +215,24 @@ pub fn soluation(nums: Vec<i32>, target: i32) -> Vec<i32> {
243
215
}
244
216
```
245
217
218
+ ### ** Nim**
219
+
220
+ ``` nim
221
+ import std/enumerate
222
+
223
+ proc twoSum(nums: seq[int], target: int): seq[int] =
224
+ var
225
+ bal: int
226
+ tdx: int
227
+ for idx, val in enumerate(nums):
228
+ bal = target - val
229
+ if bal in nums:
230
+ tdx = nums.find(bal)
231
+ if idx != tdx:
232
+ return @[idx, tdx]
233
+
234
+ ```
235
+
246
236
### ** ...**
247
237
248
238
```
0 commit comments