58
58
59
59
<!-- solution:start -->
60
60
61
- ### 方法一
61
+ ### 方法一:哈希表
62
+
63
+ 我们用一个哈希表 $\textit{d}$ 记录 $\textit{list2}$ 中的字符串和它们的下标,用一个变量 $\textit{mi}$ 记录最小的下标和。
64
+
65
+ 然后遍历 $\textit{list1}$,对于每个字符串 $\textit{s}$,如果 $\textit{s}$ 在 $\textit{list2}$ 中出现,那么我们计算 $\textit{s}$ 在 $\textit{list1}$ 中的下标 $\textit{i}$ 和在 $\textit{list2}$ 中的下标 $\textit{j}$,如果 $\textit{i} + \textit{j} < \textit{mi}$,我们就更新答案数组 $\textit{ans}$ 为 $\textit{s}$,并且更新 $\textit{mi}$ 为 $\textit{i} + \textit{j}$;如果 $\textit{i} + \textit{j} = \textit{mi}$,我们就将 $\textit{s}$ 加入答案数组 $\textit{ans}$。
66
+
67
+ 遍历结束后,返回答案数组 $\textit{ans}$ 即可。
62
68
63
69
<!-- tabs:start -->
64
70
@@ -67,40 +73,39 @@ tags:
67
73
``` python
68
74
class Solution :
69
75
def findRestaurant (self , list1 : List[str ], list2 : List[str ]) -> List[str ]:
76
+ d = {s: i for i, s in enumerate (list2)}
70
77
ans = []
71
- mp = {v: i for i, v in enumerate (list2)}
72
- mi = 2000
73
- for i, v in enumerate (list1):
74
- if v in mp:
75
- t = i + mp[v]
76
- if t < mi:
77
- mi = t
78
- ans = [v]
79
- elif t == mi:
80
- ans.append(v)
78
+ mi = inf
79
+ for i, s in enumerate (list1):
80
+ if s in d:
81
+ j = d[s]
82
+ if i + j < mi:
83
+ mi = i + j
84
+ ans = [s]
85
+ elif i + j == mi:
86
+ ans.append(s)
81
87
return ans
82
88
```
83
89
84
90
#### Java
85
91
86
92
``` java
87
93
class Solution {
88
-
89
94
public String [] findRestaurant (String [] list1 , String [] list2 ) {
90
- Map<String , Integer > mp = new HashMap<> ();
95
+ Map<String , Integer > d = new HashMap<> ();
91
96
for (int i = 0 ; i < list2. length; ++ i) {
92
- mp . put(list2[i], i);
97
+ d . put(list2[i], i);
93
98
}
94
99
List<String > ans = new ArrayList<> ();
95
- int mi = 2000 ;
100
+ int mi = 1 << 30 ;
96
101
for (int i = 0 ; i < list1. length; ++ i) {
97
- if (mp. containsKey(list1[i])) {
98
- int t = i + mp. get(list1[i]);
99
- if (t < mi) {
100
- ans = new ArrayList<> ();
102
+ if (d. containsKey(list1[i])) {
103
+ int j = d. get(list1[i]);
104
+ if (i + j < mi) {
105
+ mi = i + j;
106
+ ans. clear();
101
107
ans. add(list1[i]);
102
- mi = t;
103
- } else if (t == mi) {
108
+ } else if (i + j == mi) {
104
109
ans. add(list1[i]);
105
110
}
106
111
}
@@ -116,18 +121,20 @@ class Solution {
116
121
class Solution {
117
122
public:
118
123
vector<string > findRestaurant(vector<string >& list1, vector<string >& list2) {
119
- unordered_map<string, int> mp;
120
- for (int i = 0; i < list2.size(); ++i) mp[ list2[ i]] = i;
121
- int mi = 2000;
124
+ unordered_map<string, int> d;
125
+ for (int i = 0; i < list2.size(); ++i) {
126
+ d[ list2[ i]] = i;
127
+ }
122
128
vector<string > ans;
129
+ int mi = INT_MAX;
123
130
for (int i = 0; i < list1.size(); ++i) {
124
- if (mp.count(list1[ i] )) {
125
- int t = i + mp[ list1[ i]] ;
126
- if (t < mi) {
131
+ if (d.contains(list1[ i] )) {
132
+ int j = d[ list1[ i]] ;
133
+ if (i + j < mi) {
134
+ mi = i + j;
127
135
ans.clear();
128
136
ans.push_back(list1[ i] );
129
- mi = t;
130
- } else if (t == mi) {
137
+ } else if (i + j == mi) {
131
138
ans.push_back(list1[ i] );
132
139
}
133
140
}
@@ -141,20 +148,19 @@ public:
141
148
142
149
```go
143
150
func findRestaurant(list1 []string, list2 []string) []string {
144
- mp := make( map[string]int)
145
- for i, v := range list2 {
146
- mp[v ] = i
151
+ d := map[string]int{}
152
+ for i, s := range list2 {
153
+ d[s ] = i
147
154
}
148
- mi := 2000
149
- var ans []string
150
- for i, v := range list1 {
151
- if _, ok := mp[v]; ok {
152
- t := i + mp[v]
153
- if t < mi {
154
- ans = []string{v}
155
- mi = t
156
- } else if t == mi {
157
- ans = append(ans, v)
155
+ ans := []string{}
156
+ mi := 1 << 30
157
+ for i, s := range list1 {
158
+ if j, ok := d[s]; ok {
159
+ if i+j < mi {
160
+ mi = i + j
161
+ ans = []string{s}
162
+ } else if i+j == mi {
163
+ ans = append(ans, s)
158
164
}
159
165
}
160
166
}
@@ -166,87 +172,53 @@ func findRestaurant(list1 []string, list2 []string) []string {
166
172
167
173
``` ts
168
174
function findRestaurant(list1 : string [], list2 : string []): string [] {
169
- let minI = Infinity ;
170
- const res = [] ;
171
- const map = new Map < string , number >( list1 . map (( s , i ) => [ s , i ])) ;
172
- list2 .forEach ((s , i ) => {
173
- if (map .has (s )) {
174
- const sumI = i + map .get (s );
175
- if (sumI <= minI ) {
176
- if ( sumI < minI ) {
177
- minI = sumI ;
178
- res . length = 0 ;
179
- }
180
- res .push (s );
175
+ const d = new Map < string , number >( list2 . map (( s , i ) => [ s , i ])) ;
176
+ let mi = Infinity ;
177
+ const ans : string [] = [] ;
178
+ list1 .forEach ((s , i ) => {
179
+ if (d .has (s )) {
180
+ const j = d .get (s )! ;
181
+ if (i + j < mi ) {
182
+ mi = i + j ;
183
+ ans . length = 0 ;
184
+ ans . push ( s ) ;
185
+ } else if ( i + j === mi ) {
186
+ ans .push (s );
181
187
}
182
188
}
183
189
});
184
- return res ;
190
+ return ans ;
185
191
}
186
192
```
187
193
188
194
#### Rust
189
195
190
196
``` rust
191
197
use std :: collections :: HashMap ;
192
- use std :: iter :: FromIterator ;
193
198
194
199
impl Solution {
195
200
pub fn find_restaurant (list1 : Vec <String >, list2 : Vec <String >) -> Vec <String > {
196
- let map : HashMap <String , usize > = HashMap :: from_iter (list1 . into_iter (). zip (0 .. ));
197
- let mut res = vec! [];
198
- let mut min_i = usize :: MAX ;
199
- list2 . into_iter (). enumerate (). for_each (| (i , key )| {
200
- if map . contains_key (& key ) {
201
- let sum_i = map . get (& key ). unwrap () + i ;
202
- if sum_i <= min_i {
203
- if sum_i < min_i {
204
- min_i = sum_i ;
205
- res . clear ();
206
- }
207
- res . push (key );
208
- }
209
- }
210
- });
211
- res
212
- }
213
- }
214
- ```
215
-
216
- <!-- tabs: end -->
217
-
218
- <!-- solution: end -->
219
-
220
- <!-- solution: start -->
221
-
222
- ### 方法二
223
-
224
- <!-- tabs: start -->
201
+ let mut d = HashMap :: new ();
202
+ for (i , s ) in list2 . iter (). enumerate () {
203
+ d . insert (s , i );
204
+ }
225
205
226
- #### C++
206
+ let mut ans = Vec :: new ();
207
+ let mut mi = std :: i32 :: MAX ;
227
208
228
- ``` cpp
229
- func findRestaurant (list1[ ] string, list2[ ] string)[ ] string {
230
- mp:= make(map[ string] int)
231
- for i, v := range list2 {
232
- mp[ v] = i
233
- }
234
- mi := 2000
235
- var ans [ ] string
236
- for i, v := range list1 {
237
- if _
238
- , ok : = mp[ v] ;
239
- ok {
240
- t:
241
- = i + mp[ v] if t < mi {
242
- ans = [ ] string { v } mi = t
243
- }
244
- else if t == mi {
245
- ans = append(ans, v)
209
+ for (i , s ) in list1 . iter (). enumerate () {
210
+ if let Some (& j ) = d . get (s ) {
211
+ if (i as i32 + j as i32 ) < mi {
212
+ mi = i as i32 + j as i32 ;
213
+ ans = vec! [s . clone ()];
214
+ } else if (i as i32 + j as i32 ) == mi {
215
+ ans . push (s . clone ());
216
+ }
246
217
}
247
218
}
219
+
220
+ ans
248
221
}
249
- return ans
250
222
}
251
223
```
252
224
0 commit comments