首页 > 编程语言 >力扣599(java&python)- 两个列表的最小索引总和(简单)

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

时间:2022-10-08 10:58:23浏览次数:54  
标签:java cur min 599 list1 list list2 力扣 Shogun

题目:

假设 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

相关文章

  • Java基础——继承
    一、继承的实现我们的子类可以通过继承获取父类的属性和方法,实例化是通过实例化的变量操作对象//定义Person类publicclassPerson{Stringname;inta......
  • Java基础——封装
    一、什么是封装封装就是对象的属性和操作结合为一个整体,和并尽可能隐藏对象内部的细节。二、为什么要封装1.为了安全,提高程序的复用性,封装就是该漏的,该藏得藏。2.如果......
  • Java读取XML文本文件
    圆周率没有尽头,风景一直在路上publicclassReadXmlFileTest{/***演示java读取xml文件*/publicstaticvoidmain(String[]args){......
  • Java学习!
    Java应用构建工具:Ant,Maven,Jekin应用服务器:Tomcat,Jetty,Jboss,Websphere,WeblogicWeb开发:Struts,Spring,Hibernate,MyBatis大数据:Hadoop安卓 Java特性优势......
  • Java学习之路:快捷键
    常用的快捷键Ctrl+Shift:切换输入法Ctrl+C:复制Ctrl+V:粘贴Ctrl+X:剪切Ctrl+A:全选Ctrl+Z:撤销Ctrl+Y:返回撤销Ctrl+S:保存Shift+Delete:永久删除Alt+F4:退出窗口Win+R:打......
  • Java基础——封装
    一、什么是封装封装就是对象的属性和操作结合为一个整体,和并尽可能隐藏对象内部的细节。二、为什么要封装1.为了安全,提高程序的复用性,封装就是该漏的,该藏得藏。2.如果......
  • Java基础——方法
    一、定义方法1.除了main方法以外,我们还可以自己定义方法,方法是程序执行的最小单元。2.定义了方法可以直接调用,可以直接拿来用,缩小了代码的冗余。在Student类中定义方法......
  • javascript中的糖衣语法--Promise对象
    一、Promise的诞生1、回调地狱最初javascript的异步实现就是使用回调函数。回调地狱就是:一个函数需要等它的回调函数(或者回调和回调的回调...)执行完毕之后再执行。简单......
  • Java基础——类
    一、类1.类是对一类具有相同属性或者行为的事物的描述。类生成对象,在实际开发中通过对象处理我们的业务逻辑。2.定义类:例PublicclassStudent{//属性......
  • Java基础——对象
    区分对象:1.在外部通过引用指向的地址(直接打印引用)。2.在内部,通过this来区分。3.直接打印引用变量会调用toString方法。一、new了两个是指向两个地址Students1=new......