题目:
假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。
你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。
示例 1:
输入: list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"],list2 = ["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]
输出: ["Shogun"]
解释: 他们唯一共同喜爱的餐厅是“Shogun”。
示例 2:
输入:list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"],list2 = ["KFC", "Shogun", "Burger King"]
输出: ["Shogun"]
解释: 他们共同喜爱且具有最小索引和的餐厅是“Shogun”,它有最小的索引和1(0+1)。
提示:
- 1 <= list1.length, list2.length <= 1000
- 1 <= list1[i].length, list2[i].length <= 30
- list1[i] 和 list2[i] 由空格 ' ' 和英文字母组成。
- list1 的所有字符串都是 唯一 的。
- list2 中的所有字符串都是 唯一 的。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-index-sum-of-two-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
【模拟-哈希表】
1.创建一个哈希表,首先遍历list1,将list1中的字符串以[ list1[i], i ]形式的键值对进行存储在哈希表中;
2.设定一个最小索引值min 和 用于存储能够取得最小索引总和的字符串数组 list;
3.遍历list2,判断每一个 list2[j] 是否在哈希表中出现,根据出现的情况进行分情况讨论:
- 如果 list2[j] 没有出现在哈希表中,则跳过;
- 反之,如果list2[j] 出现在哈希表中,计算出当前的索引值cur:
- 如果cur == min,将 list2[j] 加入到 list 中;
- 如果cur < min,更新min值,将 list 清空,然后将当前 list2[j] 加入到 list 中;
- 如果cur > min,忽略,不处理。
4.最后将 list转化成字符串数组进行返回。
java代码:
1 class Solution { 2 public String[] findRestaurant(String[] list1, String[] list2) { 3 Map<String, Integer> map = new HashMap<>(); 4 int n = list1.length, m = list2.length; 5 int min = Integer.MAX_VALUE; 6 //将list1中的元素加入哈希表中 7 for(int i = 0; i < n; i++){ 8 map.put(list1[i], i); 9 } 10 List<String> list = new ArrayList<>(); 11 //遍历list2 12 for(int j = 0; j < m; j++){ 13 String s = list2[j]; 14 if(!map.containsKey(s)){ 15 continue; 16 }else{ 17 int cur = map.get(s) + j; 18 if(cur == min){ 19 list.add(s); 20 } else if(cur < min){ 21 min = cur; 22 list.clear(); 23 list.add(s); 24 } 25 } 26 } 27 return list.toArray(new String[list.size()]); 28 } 29 }
python3代码:
1 class Solution: 2 def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]: 3 map = {} 4 for i, s in enumerate(list1): 5 map[s] = i 6 min = inf 7 list = [] 8 for j, s in enumerate(list2): 9 if s in map: 10 cur = j + map[s] 11 if cur == min: 12 list.append(s) 13 elif cur < min: 14 min = cur 15 list.clear() 16 list.append(s) 17 return list
小知识:
1.list<string> res = new ArrayList<>():创建一个string集合对象,List接口 ArrayList实现
List是一种容器,数据链,可以装多种数据类型的数据,但不能同时装多种数据类型,这里<>里的String说明List里面存放的是String类型的数据。元素是有序的,也就是可以根据下标来找出每个元素,但是List只是一个接口,并不能实例化,所以用它的子类ArrayList(数组链)来创建实例。
2.INF / inf:这个值表示“无穷大(infinity 的缩写)”,即超出了计算机可以表示的浮点数的最大范围(或者说超过了 double 类型的最大值)。
标签:java,cur,min,599,list1,list,list2,力扣,Shogun From: https://www.cnblogs.com/liu-myu/p/16767946.html