minimum-index-sum-of-two-lists

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值