Skip to content
/ leetcode Public
  • Sponsor doocs/leetcode

  • Notifications You must be signed in to change notification settings
  • Fork 9k

Commit bd1d988

Browse files
authoredFeb 2, 2025··
feat: add solutions to lc problem: No.0599 (#4012)
No.0599.Minimum Index Sum of Two Lists
1 parent e100c8b commit bd1d988

File tree

9 files changed

+229
-304
lines changed

9 files changed

+229
-304
lines changed
 

‎solution/0500-0599/0599.Minimum Index Sum of Two Lists/README.md

+77-105
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,13 @@ tags:
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
6874
class 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
8793
class 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 {
116121
class Solution {
117122
public:
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
143150
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
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
168174
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);
181187
}
182188
}
183189
});
184-
return res;
190+
return ans;
185191
}
186192
```
187193

188194
#### Rust
189195

190196
```rust
191197
use std::collections::HashMap;
192-
use std::iter::FromIterator;
193198

194199
impl 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

Comments
 (0)
Please sign in to comment.