Go语言题解LeetCode599两个列表的最小索引总和

目录
  • 题目描述
  • 思路分析
  • AC 代码

题目描述

599. 两个列表的最小索引总和

假设 AndyDoris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。

你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。

示例 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 中的所有字符串都是 唯一 的。

思路分析

其实题目意思不是找有不有共同的,而是找共同喜欢且索引和最小的,换种理解方式,2个朋友想找个都喜欢的餐馆聚餐,2个人喜欢的餐馆按照距离2个人距离排序,想找一个离2个人都近的餐馆,这样理解就好理解了

所以思路是:

现存一个人的餐馆表,key是餐馆,value是距离

去匹配第二个人的餐馆表,找到了看是不是最小距离,是的话就清空之前的添加进去,相等则添加到列表

AC 代码

class Solution {
    public String[] findRestaurant(String[] list1, String[] list2) {
            if(list1 == null||list2 == null){
                return null;
            }
            HashMap<String,Integer> bucket = new HashMap<>();
            for(int i = 0;i < list1.length;i++){
                bucket.put(list1[i],i);
            }
            List<String> res = new ArrayList<>();
            int minIndexSum = Integer.MAX_VALUE;
            for(int i = 0;i< list2.length;i++){
                if(bucket.containsKey(list2[i])){
                    if(bucket.get(list2[i])+i<minIndexSum){
                        minIndexSum = bucket.get(list2[i])+i;
                        res.clear();
                        res.add(list2[i]);
                    }else if(bucket.get(list2[i])+i == minIndexSum){
                        res.add(list2[i]);
                    }
                }
            }
            return res.toArray(new String[res.size()]);
    }
}

参考

4行代码,思路简单,性能高效 - 两个列表的最小索引总和 - 力扣(LeetCode) (leetcode-cn.com)

以上就是Go语言题解LeetCode599两个列表的最小索引总和的详细内容,更多关于Go题解两个列表最小索引总和的资料请关注我们其它相关文章!

(0)

相关推荐

  • go语言题解LeetCode506相对名次示例详解

    目录 一 描述 二 分析 三 答案 一 描述 506. 相对名次 给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分.所有得分都 互不相同 . 运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推.运动员的名次决定了他们的获奖情况: 名次第 1 的运动员获金牌 "Gold Medal" . 名次第 2 的运动员获银牌 "Silver Medal" . 名次第

  • go语言题解LeetCode1122数组的相对排序

    目录 题目描述 1122. 数组的相对排序 - 力扣(LeetCode) 给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中. 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同.未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾. 示例 1: 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] 输出:[2,2,2,1,4

  • Go语言题解LeetCode561数组拆分

    目录 一 描述 二 分析 三 答案 Python 语言 - 数组拆分 解题思路 代码一 代码二 代码三 一 描述 561. 数组拆分 I - 力扣(LeetCode) (leetcode-cn.com) 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大. 返回该 最大总和 . 示例 1: 输入:nums = [1,4,3,2] 输出:4

  • go语言题解LeetCode1160拼写单词示例详解

    目录 题目描述 思路分析 AC 代码 别人用int[26] 解题思路 代码 c++几乎双百的哈希解法 代码 题目描述 1160. 拼写单词 - 力扣(LeetCode) 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars. 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词. 注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次. 返回词汇表 words 中你

  • go语言题解LeetCode1128等价多米诺骨牌对的数量

    目录 题目描述 思路分析 AC 代码 偷懒解法 思路: 图解: 代码: 哈希表+元素转换 解题思路 代码 复杂度分析 题目描述 1128. 等价多米诺骨牌对的数量 - 力扣(LeetCode) 给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的. 形式上,dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 a==c 且 b==d,或是 

  • Go语言题解LeetCode1266访问所有点的最小时间示例

    目录 题目描述 思路分析 AC 代码 题目描述 1266. 访问所有点的最小时间 - 力扣(LeetCode) 平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi] .请你计算访问所有这些点需要的 最小时间(以秒为单位). 你需要按照下面的规则在平面上移动: 每一秒内,你可以: 沿水平方向移动一个单位长度,或者 沿竖直方向移动一个单位长度,或者 跨过对角线移动 sqrt(2) 个单位长度(可以看作在一秒内向水平和竖直方向各移动一个单位长度). 必须按照数组中出现的

  • go语言题解LeetCode88合并两个有序数组示例

    目录 题目描述 思路分析 AC 代码 题目描述 原题链接 : 88. 合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目. 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列. 注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中.为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素

  • go语言题解LeetCode674最长连续递增序列

    目录 题目描述 思路分析 AC 代码 题目描述 674. 最长连续递增序列 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度. 连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列. 示例 1: 输入:nums = [1,3,5

  • C语言题解Leetcode56合并区间实例

    目录 解题思路 解题遇到的问题 后续需要总结学习的知识点 解题思路 题目链接 56. 合并区间 本质在于两两做对比,如果两个区间,可以合并,则为结果二维数组中的一员,如果不可合并,则放入结果二维数组,所以根本在于,如何判断两个区间,是可合并,还是不可合并 1.首先将二维数组,按照左端元素进行排序 2.将第一个元素放入结果区间列表 3.如果当前区间的左端元素比结果区间列表最后一个区间右端元素小,则存在包含关系,此时只需更新右端元素即可 (更新为当前区间的右端元素与结果区间的右端元素的最大值) 4.

  • C语言可变长的参数列表详解

    C语言可变长的参数列表 C语言可创建接收参数个数不确定的函数.如常用的标准库函数printf就是一个接收参数个数可变的函数.函数printf至少要接收一个字符串作为它的第一个实参.但事实上,printf还能够接收任意数目的其他实参.printf的函数原型是: int printf(const char *format, ...); 其中的省略号(…)表示这个函数可以接收可变数目的各种类型的实参. 需要注意:这个省略号必须放在形参列表的末尾. 可变参数头文件<stdarg.h>中的宏和定义,为创

  • Go语言题解LeetCode705设计哈希集合

    目录 题目描述 思路分析 AC 代码 题目描述 705. 设计哈希集合 不使用任何内建的哈希表库设计一个哈希集合(HashSet). 实现 MyHashSet 类: void add(key) 向哈希集合中插入值 key . bool contains(key) 返回哈希集合中是否存在这个值 key . void remove(key) 将给定值 key 从哈希集合中删除.如果哈希集合中没有这个值,什么也不做.   示例: 输入: ["MyHashSet", "add&quo

  • Go语言题解LeetCode888公平糖果交换示例详解

    目录 一 描述 二 分析 三 答案 一 描述 888. 公平的糖果交换 - 力扣(LeetCode) (leetcode-cn.com) 爱丽丝和鲍勃拥有不同总数量的糖果.给你两个数组 aliceSizes 和 bobSizes ,aliceSizes[i] 是爱丽丝拥有的第 i 盒糖果中的糖果数量,bobSizes[j] 是鲍勃拥有的第 j 盒糖果中的糖果数量. 两人想要互相交换一盒糖果,这样在交换之后,他们就可以拥有相同总数量的糖果.一个人拥有的糖果总数量是他们每盒糖果数量的总和. 返回一个

  • go语言题解LeetCode989数组形式的整数加法

    目录 题目描述 思路分析 AC 代码 题目描述 989. 数组形式的整数加法 - 力扣(LeetCode) 整数的 数组形式  num 是按照从左到右的顺序表示其数字的数组. 例如,对于 num = 1321 ,数组形式是 [1,3,2,1] . 给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 . 示例 1: 输入:num = [1,2,0,0], k = 34 输出:[1,2,3,4] 解释:1200 + 34 = 1234 示例 2: 输入:num

随机推荐