力扣599(java&python)- 两个列表的最小索引总和(简单)

题目:

假设 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 类型的最大值)。

posted on 2022-10-08 10:45  我不想一直当菜鸟  阅读(23)  评论(0编辑  收藏  举报