diff --git a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/README.md b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/README.md index ee4562200d5c1..1bd854f37b4b9 100644 --- a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/README.md +++ b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/README.md @@ -58,7 +58,13 @@ tags: -### 方法一 +### 方法一:哈希表 + +我们用一个哈希表 $\textit{d}$ 记录 $\textit{list2}$ 中的字符串和它们的下标,用一个变量 $\textit{mi}$ 记录最小的下标和。 + +然后遍历 $\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}$。 + +遍历结束后,返回答案数组 $\textit{ans}$ 即可。 @@ -67,17 +73,17 @@ tags: ```python class Solution: def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]: + d = {s: i for i, s in enumerate(list2)} ans = [] - mp = {v: i for i, v in enumerate(list2)} - mi = 2000 - for i, v in enumerate(list1): - if v in mp: - t = i + mp[v] - if t < mi: - mi = t - ans = [v] - elif t == mi: - ans.append(v) + mi = inf + for i, s in enumerate(list1): + if s in d: + j = d[s] + if i + j < mi: + mi = i + j + ans = [s] + elif i + j == mi: + ans.append(s) return ans ``` @@ -85,22 +91,21 @@ class Solution: ```java class Solution { - public String[] findRestaurant(String[] list1, String[] list2) { - Map mp = new HashMap<>(); + Map d = new HashMap<>(); for (int i = 0; i < list2.length; ++i) { - mp.put(list2[i], i); + d.put(list2[i], i); } List ans = new ArrayList<>(); - int mi = 2000; + int mi = 1 << 30; for (int i = 0; i < list1.length; ++i) { - if (mp.containsKey(list1[i])) { - int t = i + mp.get(list1[i]); - if (t < mi) { - ans = new ArrayList<>(); + if (d.containsKey(list1[i])) { + int j = d.get(list1[i]); + if (i + j < mi) { + mi = i + j; + ans.clear(); ans.add(list1[i]); - mi = t; - } else if (t == mi) { + } else if (i + j == mi) { ans.add(list1[i]); } } @@ -116,18 +121,20 @@ class Solution { class Solution { public: vector findRestaurant(vector& list1, vector& list2) { - unordered_map mp; - for (int i = 0; i < list2.size(); ++i) mp[list2[i]] = i; - int mi = 2000; + unordered_map d; + for (int i = 0; i < list2.size(); ++i) { + d[list2[i]] = i; + } vector ans; + int mi = INT_MAX; for (int i = 0; i < list1.size(); ++i) { - if (mp.count(list1[i])) { - int t = i + mp[list1[i]]; - if (t < mi) { + if (d.contains(list1[i])) { + int j = d[list1[i]]; + if (i + j < mi) { + mi = i + j; ans.clear(); ans.push_back(list1[i]); - mi = t; - } else if (t == mi) { + } else if (i + j == mi) { ans.push_back(list1[i]); } } @@ -141,20 +148,19 @@ public: ```go func findRestaurant(list1 []string, list2 []string) []string { - mp := make(map[string]int) - for i, v := range list2 { - mp[v] = i + d := map[string]int{} + for i, s := range list2 { + d[s] = i } - mi := 2000 - var ans []string - for i, v := range list1 { - if _, ok := mp[v]; ok { - t := i + mp[v] - if t < mi { - ans = []string{v} - mi = t - } else if t == mi { - ans = append(ans, v) + ans := []string{} + mi := 1 << 30 + for i, s := range list1 { + if j, ok := d[s]; ok { + if i+j < mi { + mi = i + j + ans = []string{s} + } else if i+j == mi { + ans = append(ans, s) } } } @@ -166,22 +172,22 @@ func findRestaurant(list1 []string, list2 []string) []string { ```ts function findRestaurant(list1: string[], list2: string[]): string[] { - let minI = Infinity; - const res = []; - const map = new Map(list1.map((s, i) => [s, i])); - list2.forEach((s, i) => { - if (map.has(s)) { - const sumI = i + map.get(s); - if (sumI <= minI) { - if (sumI < minI) { - minI = sumI; - res.length = 0; - } - res.push(s); + const d = new Map(list2.map((s, i) => [s, i])); + let mi = Infinity; + const ans: string[] = []; + list1.forEach((s, i) => { + if (d.has(s)) { + const j = d.get(s)!; + if (i + j < mi) { + mi = i + j; + ans.length = 0; + ans.push(s); + } else if (i + j === mi) { + ans.push(s); } } }); - return res; + return ans; } ``` @@ -189,64 +195,30 @@ function findRestaurant(list1: string[], list2: string[]): string[] { ```rust use std::collections::HashMap; -use std::iter::FromIterator; impl Solution { pub fn find_restaurant(list1: Vec, list2: Vec) -> Vec { - let map: HashMap = HashMap::from_iter(list1.into_iter().zip(0..)); - let mut res = vec![]; - let mut min_i = usize::MAX; - list2.into_iter().enumerate().for_each(|(i, key)| { - if map.contains_key(&key) { - let sum_i = map.get(&key).unwrap() + i; - if sum_i <= min_i { - if sum_i < min_i { - min_i = sum_i; - res.clear(); - } - res.push(key); - } - } - }); - res - } -} -``` - - - - - - - -### 方法二 - - + let mut d = HashMap::new(); + for (i, s) in list2.iter().enumerate() { + d.insert(s, i); + } -#### C++ + let mut ans = Vec::new(); + let mut mi = std::i32::MAX; -```cpp -func findRestaurant(list1[] string, list2[] string)[] string { -mp:= make(map[string]int) - for i, v := range list2 { - mp[v] = i - } - mi := 2000 - var ans []string - for i, v := range list1 { - if _ - , ok : = mp[v]; - ok { - t: - = i + mp[v] if t < mi { - ans = [] string { v } mi = t - } - else if t == mi { - ans = append(ans, v) + for (i, s) in list1.iter().enumerate() { + if let Some(&j) = d.get(s) { + if (i as i32 + j as i32) < mi { + mi = i as i32 + j as i32; + ans = vec![s.clone()]; + } else if (i as i32 + j as i32) == mi { + ans.push(s.clone()); + } } } + + ans } - return ans } ``` diff --git a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/README_EN.md b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/README_EN.md index a0e64465e8d62..f9cf34862ec4e 100644 --- a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/README_EN.md +++ b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/README_EN.md @@ -73,7 +73,13 @@ The strings with the least index sum are "sad" and "happy". -### Solution 1 +### Solution 1: Hash Table + +We use a hash table $\textit{d}$ to record the strings in $\textit{list2}$ and their indices, and a variable $\textit{mi}$ to record the minimum index sum. + +Then, we traverse $\textit{list1}$. For each string $\textit{s}$, if $\textit{s}$ appears in $\textit{list2}$, we calculate the index $\textit{i}$ of $\textit{s}$ in $\textit{list1}$ and the index $\textit{j}$ in $\textit{list2}$. If $\textit{i} + \textit{j} < \textit{mi}$, we update the answer array $\textit{ans}$ to $\textit{s}$ and update $\textit{mi}$ to $\textit{i} + \textit{j}$. If $\textit{i} + \textit{j} = \textit{mi}$, we add $\textit{s}$ to the answer array $\textit{ans}$. + +After traversing, return the answer array $\textit{ans}$. @@ -82,17 +88,17 @@ The strings with the least index sum are "sad" and "happy". ```python class Solution: def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]: + d = {s: i for i, s in enumerate(list2)} ans = [] - mp = {v: i for i, v in enumerate(list2)} - mi = 2000 - for i, v in enumerate(list1): - if v in mp: - t = i + mp[v] - if t < mi: - mi = t - ans = [v] - elif t == mi: - ans.append(v) + mi = inf + for i, s in enumerate(list1): + if s in d: + j = d[s] + if i + j < mi: + mi = i + j + ans = [s] + elif i + j == mi: + ans.append(s) return ans ``` @@ -100,22 +106,21 @@ class Solution: ```java class Solution { - public String[] findRestaurant(String[] list1, String[] list2) { - Map mp = new HashMap<>(); + Map d = new HashMap<>(); for (int i = 0; i < list2.length; ++i) { - mp.put(list2[i], i); + d.put(list2[i], i); } List ans = new ArrayList<>(); - int mi = 2000; + int mi = 1 << 30; for (int i = 0; i < list1.length; ++i) { - if (mp.containsKey(list1[i])) { - int t = i + mp.get(list1[i]); - if (t < mi) { - ans = new ArrayList<>(); + if (d.containsKey(list1[i])) { + int j = d.get(list1[i]); + if (i + j < mi) { + mi = i + j; + ans.clear(); ans.add(list1[i]); - mi = t; - } else if (t == mi) { + } else if (i + j == mi) { ans.add(list1[i]); } } @@ -131,18 +136,20 @@ class Solution { class Solution { public: vector findRestaurant(vector& list1, vector& list2) { - unordered_map mp; - for (int i = 0; i < list2.size(); ++i) mp[list2[i]] = i; - int mi = 2000; + unordered_map d; + for (int i = 0; i < list2.size(); ++i) { + d[list2[i]] = i; + } vector ans; + int mi = INT_MAX; for (int i = 0; i < list1.size(); ++i) { - if (mp.count(list1[i])) { - int t = i + mp[list1[i]]; - if (t < mi) { + if (d.contains(list1[i])) { + int j = d[list1[i]]; + if (i + j < mi) { + mi = i + j; ans.clear(); ans.push_back(list1[i]); - mi = t; - } else if (t == mi) { + } else if (i + j == mi) { ans.push_back(list1[i]); } } @@ -156,20 +163,19 @@ public: ```go func findRestaurant(list1 []string, list2 []string) []string { - mp := make(map[string]int) - for i, v := range list2 { - mp[v] = i + d := map[string]int{} + for i, s := range list2 { + d[s] = i } - mi := 2000 - var ans []string - for i, v := range list1 { - if _, ok := mp[v]; ok { - t := i + mp[v] - if t < mi { - ans = []string{v} - mi = t - } else if t == mi { - ans = append(ans, v) + ans := []string{} + mi := 1 << 30 + for i, s := range list1 { + if j, ok := d[s]; ok { + if i+j < mi { + mi = i + j + ans = []string{s} + } else if i+j == mi { + ans = append(ans, s) } } } @@ -181,22 +187,22 @@ func findRestaurant(list1 []string, list2 []string) []string { ```ts function findRestaurant(list1: string[], list2: string[]): string[] { - let minI = Infinity; - const res = []; - const map = new Map(list1.map((s, i) => [s, i])); - list2.forEach((s, i) => { - if (map.has(s)) { - const sumI = i + map.get(s); - if (sumI <= minI) { - if (sumI < minI) { - minI = sumI; - res.length = 0; - } - res.push(s); + const d = new Map(list2.map((s, i) => [s, i])); + let mi = Infinity; + const ans: string[] = []; + list1.forEach((s, i) => { + if (d.has(s)) { + const j = d.get(s)!; + if (i + j < mi) { + mi = i + j; + ans.length = 0; + ans.push(s); + } else if (i + j === mi) { + ans.push(s); } } }); - return res; + return ans; } ``` @@ -204,64 +210,30 @@ function findRestaurant(list1: string[], list2: string[]): string[] { ```rust use std::collections::HashMap; -use std::iter::FromIterator; impl Solution { pub fn find_restaurant(list1: Vec, list2: Vec) -> Vec { - let map: HashMap = HashMap::from_iter(list1.into_iter().zip(0..)); - let mut res = vec![]; - let mut min_i = usize::MAX; - list2.into_iter().enumerate().for_each(|(i, key)| { - if map.contains_key(&key) { - let sum_i = map.get(&key).unwrap() + i; - if sum_i <= min_i { - if sum_i < min_i { - min_i = sum_i; - res.clear(); - } - res.push(key); - } - } - }); - res - } -} -``` - - - - - - - -### Solution 2 - - + let mut d = HashMap::new(); + for (i, s) in list2.iter().enumerate() { + d.insert(s, i); + } -#### C++ + let mut ans = Vec::new(); + let mut mi = std::i32::MAX; -```cpp -func findRestaurant(list1[] string, list2[] string)[] string { -mp:= make(map[string]int) - for i, v := range list2 { - mp[v] = i - } - mi := 2000 - var ans []string - for i, v := range list1 { - if _ - , ok : = mp[v]; - ok { - t: - = i + mp[v] if t < mi { - ans = [] string { v } mi = t - } - else if t == mi { - ans = append(ans, v) + for (i, s) in list1.iter().enumerate() { + if let Some(&j) = d.get(s) { + if (i as i32 + j as i32) < mi { + mi = i as i32 + j as i32; + ans = vec![s.clone()]; + } else if (i as i32 + j as i32) == mi { + ans.push(s.clone()); + } } } + + ans } - return ans } ``` diff --git a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.cpp b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.cpp index d33f608f3b60b..ade98280138cf 100644 --- a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.cpp +++ b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.cpp @@ -1,22 +1,24 @@ class Solution { public: vector findRestaurant(vector& list1, vector& list2) { - unordered_map mp; - for (int i = 0; i < list2.size(); ++i) mp[list2[i]] = i; - int mi = 2000; + unordered_map d; + for (int i = 0; i < list2.size(); ++i) { + d[list2[i]] = i; + } vector ans; + int mi = INT_MAX; for (int i = 0; i < list1.size(); ++i) { - if (mp.count(list1[i])) { - int t = i + mp[list1[i]]; - if (t < mi) { + if (d.contains(list1[i])) { + int j = d[list1[i]]; + if (i + j < mi) { + mi = i + j; ans.clear(); ans.push_back(list1[i]); - mi = t; - } else if (t == mi) { + } else if (i + j == mi) { ans.push_back(list1[i]); } } } return ans; } -}; \ No newline at end of file +}; diff --git a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.go b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.go index 5bfa1334781f0..e069fe63e716e 100644 --- a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.go +++ b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.go @@ -1,20 +1,19 @@ func findRestaurant(list1 []string, list2 []string) []string { - mp := make(map[string]int) - for i, v := range list2 { - mp[v] = i + d := map[string]int{} + for i, s := range list2 { + d[s] = i } - mi := 2000 - var ans []string - for i, v := range list1 { - if _, ok := mp[v]; ok { - t := i + mp[v] - if t < mi { - ans = []string{v} - mi = t - } else if t == mi { - ans = append(ans, v) + ans := []string{} + mi := 1 << 30 + for i, s := range list1 { + if j, ok := d[s]; ok { + if i+j < mi { + mi = i + j + ans = []string{s} + } else if i+j == mi { + ans = append(ans, s) } } } return ans -} \ No newline at end of file +} diff --git a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.java b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.java index fafafbab7ab6f..a300539fd97e9 100644 --- a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.java +++ b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.java @@ -1,24 +1,23 @@ class Solution { - public String[] findRestaurant(String[] list1, String[] list2) { - Map mp = new HashMap<>(); + Map d = new HashMap<>(); for (int i = 0; i < list2.length; ++i) { - mp.put(list2[i], i); + d.put(list2[i], i); } List ans = new ArrayList<>(); - int mi = 2000; + int mi = 1 << 30; for (int i = 0; i < list1.length; ++i) { - if (mp.containsKey(list1[i])) { - int t = i + mp.get(list1[i]); - if (t < mi) { - ans = new ArrayList<>(); + if (d.containsKey(list1[i])) { + int j = d.get(list1[i]); + if (i + j < mi) { + mi = i + j; + ans.clear(); ans.add(list1[i]); - mi = t; - } else if (t == mi) { + } else if (i + j == mi) { ans.add(list1[i]); } } } return ans.toArray(new String[0]); } -} \ No newline at end of file +} diff --git a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.py b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.py index ec307c7dac0cb..156bfc1d9aec7 100644 --- a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.py +++ b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.py @@ -1,14 +1,14 @@ class Solution: def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]: + d = {s: i for i, s in enumerate(list2)} ans = [] - mp = {v: i for i, v in enumerate(list2)} - mi = 2000 - for i, v in enumerate(list1): - if v in mp: - t = i + mp[v] - if t < mi: - mi = t - ans = [v] - elif t == mi: - ans.append(v) + mi = inf + for i, s in enumerate(list1): + if s in d: + j = d[s] + if i + j < mi: + mi = i + j + ans = [s] + elif i + j == mi: + ans.append(s) return ans diff --git a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.rs b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.rs index 877219d1c36bc..8d6ea37aae682 100644 --- a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.rs +++ b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.rs @@ -1,23 +1,26 @@ use std::collections::HashMap; -use std::iter::FromIterator; impl Solution { pub fn find_restaurant(list1: Vec, list2: Vec) -> Vec { - let map: HashMap = HashMap::from_iter(list1.into_iter().zip(0..)); - let mut res = vec![]; - let mut min_i = usize::MAX; - list2.into_iter().enumerate().for_each(|(i, key)| { - if map.contains_key(&key) { - let sum_i = map.get(&key).unwrap() + i; - if sum_i <= min_i { - if sum_i < min_i { - min_i = sum_i; - res.clear(); - } - res.push(key); + let mut d = HashMap::new(); + for (i, s) in list2.iter().enumerate() { + d.insert(s, i); + } + + let mut ans = Vec::new(); + let mut mi = std::i32::MAX; + + for (i, s) in list1.iter().enumerate() { + if let Some(&j) = d.get(s) { + if (i as i32 + j as i32) < mi { + mi = i as i32 + j as i32; + ans = vec![s.clone()]; + } else if (i as i32 + j as i32) == mi { + ans.push(s.clone()); } } - }); - res + } + + ans } } diff --git a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.ts b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.ts index f829f2e6d43ee..325d91ef6ec83 100644 --- a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.ts +++ b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution.ts @@ -1,18 +1,18 @@ function findRestaurant(list1: string[], list2: string[]): string[] { - let minI = Infinity; - const res = []; - const map = new Map(list1.map((s, i) => [s, i])); - list2.forEach((s, i) => { - if (map.has(s)) { - const sumI = i + map.get(s); - if (sumI <= minI) { - if (sumI < minI) { - minI = sumI; - res.length = 0; - } - res.push(s); + const d = new Map(list2.map((s, i) => [s, i])); + let mi = Infinity; + const ans: string[] = []; + list1.forEach((s, i) => { + if (d.has(s)) { + const j = d.get(s)!; + if (i + j < mi) { + mi = i + j; + ans.length = 0; + ans.push(s); + } else if (i + j === mi) { + ans.push(s); } } }); - return res; + return ans; } diff --git a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution2.cpp b/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution2.cpp deleted file mode 100644 index 43a34545c3b22..0000000000000 --- a/solution/0500-0599/0599.Minimum Index Sum of Two Lists/Solution2.cpp +++ /dev/null @@ -1,22 +0,0 @@ -func findRestaurant(list1[] string, list2[] string)[] string { -mp:= make(map[string]int) - for i, v := range list2 { - mp[v] = i - } - mi := 2000 - var ans []string - for i, v := range list1 { - if _ - , ok : = mp[v]; - ok { - t: - = i + mp[v] if t < mi { - ans = [] string { v } mi = t - } - else if t == mi { - ans = append(ans, v) - } - } - } - return ans -} \ No newline at end of file