假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。
你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设答案总是存在
输入:list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"],list2 = ["KFC", "Shogun", "Burger King"]
输出: ["Shogun"]
解释: 他们共同喜爱且具有最小索引和的餐厅是“Shogun”,它有最小的索引和1(0+1)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-index-sum-of-two-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一 解题思路:
1. 找到两个list中所有的共同元素:
避免使用遍历,用set求共同集合的方式;
2. 找出每个共同元素在两个原始list中对应的index值:
用到list原生方法list.index();
使用dict方式,index之和作为key, 共同元素作为value.这样考虑是因为:
a. 不同的index之和不会有共同的元素,而不同的元素有可能有相同的index之和,如果使用元素作为key, 即使找出了最小index之和,还要反向定位key,需要更多步骤。
b. 题目要求从最小的index之和找出对应的元素, 可见index之和是索引的关键,作为key也是合情合理。
用到了defaultdict(list),用法:python中defaultdict用法详解 - 简书
目的是一个key可能有多个元素对应,所以提前声明value类型是个list
3. 排序
排序的时候用到sorted.
二 知识点
1. leetcode模板里面 不允许再定义其他的func;最后要return 题干要求的值包括正确的类型,而不是print
2. set是一个无序不重复元素集,但是可遍历
3. from collections import defaultdict
4. sorted 是有返回值的;sorted(dict)直接按照dict的key值排序并以list的形式返回排序之后的keys
5. lambda用法:
lambda 并不会带来程序运行效率的提高,只会使代码更简洁。
如果可以使用for...in...if来完成的,坚决不用lambda。
如果使用lambda,lambda内不要包含循环,如果有,我宁愿定义函数来完成,使代码获得可重用性和更好的可读性。
lambda x:x+1 其中x是输入,x+1 是输出;输入一般就是要处理的源数据的迭代对象,如果源数据类型是dict, 那x一般就是该dict的key;如果是list,那就是list的元素
三 提交代码:
from collections import defaultdict
class Solution(object):
def findRestaurant(self, list1, list2):
"""
:type list1: List[str]
:type list2: List[str]
:rtype: List[str]
"""
set_1 = set(list1)
set_2 = set(list2)
set_common = set_1 & set_2
if set_common:
common_map= defaultdict(list)
for resta in set_common:
key_1 = list1.index(resta)
key_2 = list2.index(resta)
common_map[key_1+key_2].append(resta)
index_list = sorted(common_map)
return common_map[index_list[0]]