LeetCode 599: 两个列表的最小索引总和 Minimum Index Sum of Two Lists
题目:
假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。
Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of favorite restaurants represented by strings.
你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。如果答案不止一个,则输出所有答案并且不考虑顺序。你可以假设总是存在一个答案。
You need to help them find out their common interest with the least list index sum. If there is a choice tie between answers, output all of them with no order requirement. You could assume there always exists an answer.
示例 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。
- 两个列表都没有重复的元素。
Note:
- The length of both lists will be in the range of [1, 1000].
- The length of strings in both lists will be in the range of [1, 30].
- The index is starting from 0 to the list length minus 1.
- No duplicates in both lists.
解题思路:
两个字符串数组,找重复出现的元素,返回其索引和最小的目标数组。最容易想到的解法就是用哈希映射解题,Key 存储其数组的每个元素值,Value 存储其下标索引。第一次遍历将其中一个数组添加到哈希映射,第二次遍历查找目标元素。需要维护一个最小索引和来保证查询的目标索引和为最小。
哈希表解题:
Java:
class Solution {
public String[] findRestaurant(String[] list1, String[] list2) {
Map<String, Integer> map = new HashMap<>();//建立哈希映射
for (int i = 0; i < list1.length; i++)//初次遍历将一个数组建立映射关系
map.put(list1[i], i);
List<String> res = new ArrayList<>();//待返回的目标数组
int sum = Integer.MAX_VALUE;//sum为当前满足条件的最小索引和
for (int i = 0; i < list2.length; i++) {//第二次遍历查找目标元素
if (map.containsKey(list2[i])) {
int tmp = i + map.get(list2[i]);//当前索引和
if (tmp < sum) {//如果当前索引和更小
res.clear();//清除目标数组
res.add(list2[i]);//添加该元素
sum = tmp;// 刷新最小索引和
} else if (tmp == sum)//如果索引和相等
res.add(list2[i]);//只添加元素
}
}
return res.toArray(new String[res.size()]);//转成 string 数组
}
}
Python:
class Solution:
def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]:
hash_map = dict()# 建立哈希映射
for i, s in enumerate(list1):# 初次遍历将一个数组建立映射关系
hash_map[s] = i
min_sum = 2001# 当前满足条件的最小索引和
res = list()# 待返回的目标数组
for i, s in enumerate(list2):# 第二次枚举遍历查找目标元素
if s in hash_map:
tmp = i+hash_map[s]# 当前索引和
if tmp < min_sum:# 如果当前索引和更小
res.clear()# 清除目标数组
res.append(s)# 添加该元素
min_sum = tmp# 刷新最小索引和
elif tmp == min_sum:# 如果索引和相等
res.append(s)# 只添加元素
return res
操作索引解题:
这种解法非常巧妙,虽然效率很低。以下解释摘自 LeetCode,可以作为参考扩展思路:
另一种可以遍历不同 sumsum (下标和),并判断是否有字符串分别出现在 list1 和 list2 中且下标和为 sum。
现在我们知道下标和的值 sum 数值范围从 0 到 m + n - 1。这里 m 和 n 分别是 list1 和 list2 的长度,我们现在可以升序枚举 sum ,对于每个 sum,我们遍历 list1,假设当前下标为 i,为了得到下标和 sum,list2 中的下标 j 为 sum−i。通过这样的办法,我们不需要遍历 list2,而可以直接通过计算得到在 list2 中对应的下标。
对于每个 sum,我们遍历 list1 的所有下标,一旦有 list1 和 list2 中的字符串匹配,就把匹配字符串放入一个 res 列表中。
我们对 sum 升序数组中所有值做相同的过程,对于每个 sum 遍历完一遍 list1 之后,我们检查 res 列表是否为空。如果是空的,我们继续遍历下一个 sum 数组。如果不为空,当前的 res 就是最小下标和的数组。这是因为我们遍历 sum 的顺序是升序的,所以第一个找到的列表就是结果列表。
Java:
class Solution {
public String[] findRestaurant(String[] list1, String[] list2) {
List<String> res = new ArrayList<>();
for (int sum = 0; sum < list1.length + list2.length - 1; sum++) {
for (int i = 0; i <= sum; i++) {
if (i < list1.length && sum - i < list2.length && list1[i].equals(list2[sum - i]))
res.add(list1[i]);
}
if (res.size() > 0) break;//一旦找到最小索引和序列直接结束遍历,因为sum是递增的,之后得到的索引和一定更大
}
return res.toArray(new String[res.size()]);
}
}
Python
class Solution:
def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]:
res = list()
list1_size, list2_size = len(list1), len(list2)
for min_sum in range(list1_size+list2_size-1):
for i in range(min_sum+1):
if i < list1_size and min_sum-i < list2_size and list1[i] == list2[min_sum-i]:
res.append(list1[i])
if len(res) > 0:# 一旦找到最小索引和序列直接结束遍历,因为sum是递增的,之后得到的索引和一定更大
break
return res
欢迎关注微。信公。众号:爱写Bug

LeetCode 599: 两个列表的最小索引总和 Minimum Index Sum of Two Lists的更多相关文章
- [Swift]LeetCode599. 两个列表的最小索引总和 | Minimum Index Sum of Two Lists
Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of favorite ...
- Java实现 LeetCode 599 两个列表的最小索引总和(使用hash提高效率)
599. 两个列表的最小索引总和 假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅 ...
- Leetcode 599.两个列表的最小索引总和
两个列表的最小索引总和 假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅. 如果答 ...
- 领扣(LeetCode)两个列表的最小索引总和 个人题解
假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅. 如果答案不止一个,则输出所有答 ...
- 【leetcode 简单】 第一百五十题 两个列表的最小索引总和
假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅. 如果答案不止一个,则输出所有答 ...
- 【Leetcode_easy】599. Minimum Index Sum of Two Lists
problem 599. Minimum Index Sum of Two Lists 题意:给出两个字符串数组,找到坐标位置之和最小的相同的字符串. 计算两个的坐标之和,如果与最小坐标和sum相同, ...
- 599. Minimum Index Sum of Two Lists两个餐厅列表的索引和最小
[抄题]: Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of fa ...
- C#LeetCode刷题之#599-两个列表的最小索引总和(Minimum Index Sum of Two Lists)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3802 访问. 假设Andy和Doris想在晚餐时选择一家餐厅,并 ...
- LeetCode 599. Minimum Index Sum of Two Lists (从两个lists里找到相同的并且位置总和最靠前的)
Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of favorite ...
随机推荐
- [PHP] php使用event扩展的io复用测试
先要安装event扩展,这样才可以使用libevent的事件机制 pecl install event 测试代码 //连接重用 //创建资源流的上下文 $context=stream_context_ ...
- Docker-compose安装和应用
安装 1.为什么要使用docker-compose? 使用 Docker Compose 可以轻松.高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具 2.其他前置条件需要 ...
- [译]Vulkan教程(16)图形管道基础之总结
[译]Vulkan教程(16)图形管道基础之总结 Conclusion 总结 We can now combine all of the structures and objects from the ...
- dev c++必须修改的三处默认设置
此文档记录参加pat考试并且以dev c++[针对5.11版本]软件作为开发工具时,必须修改的三个默认设置. 1.修改默认语言标准 Dev C++ 5.11 版本支持较新的 C 和 C++ 标准,但是 ...
- Redis缓存与数据库一致性解决方案
背景 缓存是数据库的副本,应用在查询数据时,先从缓存中查询,如果命中直接返回,如果未命中,去数据库查询最新数据并返回,同时写入缓存. 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载.是应用架 ...
- Django入门必知必会操作
一.Django基础必备三件套 HttpRseponse 内部传入一个字符串参数,返回给浏览器. 在app目录下的views.py添加函数,添加函数之前必须在urls.py添加函数对应关系,否则访问不 ...
- C#中获取指定目录下所有目录的名称、全路径和创建日期
场景 指定一个路径,根据这个父级路径获取此目录下所有目录的名称.全路径.创建日期等信息. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众 ...
- Selenium(五):CSS选择器(二)
1. CSS选择器 1.1 选择语法联合使用 CSS selector的另一个强大之处在于:选择语法可以联合使用. html代码: <div id='bottom'> <div cl ...
- Web前端基础(15):jQuery基础(二)
1. jQuery选择器 jQuery选择器是jQuery强大的体现,它提供了一组方法,让我们更加方便的获取到页面中的元素. 1.1 基本选择器 例子如下: <!DOCTYPE html> ...
- Linux介绍以及VMware和Centos的安装
一. Linux介绍 1 Linux诞生的故事 Unix篇: 为了进一步强化大型主机的功能,让主机的资源可以提供更多的使用者来利用,所以在1964年, 由AT&A公司的贝尔实验室(Bell). ...