Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述
假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。
你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。
示例
示例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 <= 10001 <= list1[i].length, list2[i].length <= 30list1[i] 和 list2[i] 由空格 ' ' 和英文字母组成。- list1 的所有字符串都是唯一的。
- list2 中的所有字符串都是唯一的。
难度:简单
二、思路分析
众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。 此题为简单题,兄弟们可以重拳出击,没错,就是你想到的那种方法,简单粗暴!
题目解析
- 根据题目描述,用 最少的索引 找出 Andy 和 Doris 两者共同喜欢的餐厅,如果不止一个,则输出所有答案,不考虑顺序。可以看出这是在寻找两个字符串集合中相同的元素,而结果元素要满足在两个集合中索引之和最小。
- 如果对于题目中 最少的索引 不太明白,可以对照给出的示例来进一步理解到位。
- 题目的提示部分也是比较重要,我们可以从中得到如下相关信息
- 数组长度均不超过1000,因此对于最小索引最大值,可以设置为2001
- 数组中元素都是唯一的,降低难度,可以使用map直接存放筛选
解题思路
在题目解析中,已经分析了题目的要求和给到的信息,因此对于该题目,可以使用的方法和具体流程如下。
- 定义相关变量,最小索引和的最大值minSum=2000,返回结果集合resultList,用于快速查找喜爱和索引值的map
- 遍历其中一个人的爱好数组,将喜爱餐厅和对应的索引放入map集合中,餐厅名作为key,索引值作为value,用来匹配共同喜爱的餐厅
- 遍历另外一个人的爱好数组,每次去map中查找是否是共同喜爱的餐厅,
- 如果是,则计算当前索引和,并与当前最小索引和相比,
- 大于则不处理;
- 相等则将餐厅加入结果集合resultList;
- 小于则先清空结果集合,再将当前餐厅加入,并将最小索引和更新为当前值。
- 如果不是,则继续遍历下一个餐厅
- 如果是,则计算当前索引和,并与当前最小索引和相比,
- 最后得到的结果集合resultList就是题目结果,将其转为数组返回。
三、AC 代码
public String[] findRestaurant(String[] list1, String[] list2) {
// 使用map将其中一个喜爱数组以value-index形式存储,遍历另外一个数组,在有共同喜爱时判断索引和
Map<String,Integer> map = new HashMap<>();
for(int i = 0; i < list2.length; i++){
map.put(list2[i],i);
}
List<String> resultList = new ArrayList<>();
int minSum = 2001;
for(int i = 0; i < list1.length; i++){
String str = list1[i];
if(map.containsKey(str)){
int curIndexSum = map.get(str) + i;
if(curIndexSum == minSum){
resultList.add(str);
}else if(curIndexSum < minSum){
minSum = curIndexSum;
resultList.clear();
resultList.add(str);
}
}
}
return resultList.toArray(new String[resultList.size()]);
}
四、总结
知识点
- Java 获取数组的长度:
int len = arr.length; - Java 中集合转数组:
String[] arr = list.toArray(new Array[list.size()]);
最后
阳春三月,算法刷起来!LeetCode 每日一题。
简单题,不需要考虑太多,开干就是了。