599 两个列表的最小索引总和(哈希表)

1. 问题描述:

假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设总是存在一个答案。

示例 1:

输入:
["Shogun", "Tapioca Express", "Burger King", "KFC"]
["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]
输出: ["Shogun"]
解释: 他们唯一共同喜爱的餐厅是“Shogun”。

示例 2:

输入:
["Shogun", "Tapioca Express", "Burger King", "KFC"]
["KFC", "Shogun", "Burger King"]
输出: ["Shogun"]
解释: 他们共同喜爱且具有最小索引和的餐厅是“Shogun”,它有最小的索引和1(0+1)。

提示:

两个列表的长度范围都在 [1, 1000]内。
两个列表中的字符串的长度将在[1,30]的范围内。
下标从0开始,到列表的长度减1。
两个列表都没有重复的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-index-sum-of-two-lists

2. 思路分析:

分析题目可以知道我们首先需要找到在list1和list2同时出现的字符串,判断字符串是否存在一个集合或者列表可以使用哈希表来判断,我们可以先扫描一遍list1,将list1中的所有字符串出现的位置都记录在哈希表中,然后遍历一下list2,判断当前遍历的字符串是否存在哈希表中,如果存在说明当前的字符串是同时存在list1和list2中,并且我们需要一个变量count来维护当前索引之和的最小值,变量res来记录答案,当我们找到同时在list1和list中存在的字符串的时候,判断当前字符串的索引之和是否小于之前的索引之和,如果小于那么更新res和count,如果相等说明需要将当前字符串添加到答案中。主要使用到了哈希表的映射功能,判断元素是否存在于某个集合中

3. 代码如下:

from typing import List
import collections


class Solution:
    # 哈希表
    def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]:
        dic = collections.defaultdict(int)
        for i in range(len(list1)):
            # 因为使用的collections.defaultdict的字典所以将下标映射为i + 1这样可以避免后面判断dic[s] > 0中下标为0的字符串也满足的情况
            dic[list1[i]] = i + 1
        count = 10 ** 9
        res = list()
        for i in range(len(list2)):
            s = list2[i]
            # 当前字符串在list1和list2都存在
            if dic[s] > 0:
                t = i + dic[s] - 1
                if t < count:
                    res = [s]
                    count = t
                elif t == count:
                    res.append(s)
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值