5858
5959<!-- solution:start -->
6060
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}$ 即可。
6268
6369<!-- tabs:start -->
6470
@@ -67,40 +73,39 @@ tags:
6773``` python
6874class Solution :
6975 def findRestaurant (self , list1 : List[str ], list2 : List[str ]) -> List[str ]:
76+ d = {s: i for i, s in enumerate (list2)}
7077 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)
8187 return ans
8288```
8389
8490#### Java
8591
8692``` java
8793class Solution {
88-
8994 public String [] findRestaurant (String [] list1 , String [] list2 ) {
90- Map<String , Integer > mp = new HashMap<> ();
95+ Map<String , Integer > d = new HashMap<> ();
9196 for (int i = 0 ; i < list2. length; ++ i) {
92- mp . put(list2[i], i);
97+ d . put(list2[i], i);
9398 }
9499 List<String > ans = new ArrayList<> ();
95- int mi = 2000 ;
100+ int mi = 1 << 30 ;
96101 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();
101107 ans. add(list1[i]);
102- mi = t;
103- } else if (t == mi) {
108+ } else if (i + j == mi) {
104109 ans. add(list1[i]);
105110 }
106111 }
@@ -116,18 +121,20 @@ class Solution {
116121class Solution {
117122public:
118123 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+ }
122128 vector<string > ans;
129+ int mi = INT_MAX;
123130 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;
127135 ans.clear();
128136 ans.push_back(list1[ i] );
129- mi = t;
130- } else if (t == mi) {
137+ } else if (i + j == mi) {
131138 ans.push_back(list1[ i] );
132139 }
133140 }
@@ -141,20 +148,19 @@ public:
141148
142149```go
143150func 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
147154 }
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)
158164 }
159165 }
160166 }
@@ -166,87 +172,53 @@ func findRestaurant(list1 []string, list2 []string) []string {
166172
167173``` ts
168174function 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 );
181187 }
182188 }
183189 });
184- return res ;
190+ return ans ;
185191}
186192```
187193
188194#### Rust
189195
190196``` rust
191197use std :: collections :: HashMap ;
192- use std :: iter :: FromIterator ;
193198
194199impl Solution {
195200 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+ }
225205
226- #### C++
206+ let mut ans = Vec :: new ();
207+ let mut mi = std :: i32 :: MAX ;
227208
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+ }
246217 }
247218 }
219+
220+ ans
248221 }
249- return ans
250222}
251223```
252224
0 commit comments