Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目:
leetcode 两个列表的最小索引总和
假设 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 <= 1000
1 <= list1[i].length, list2[i].length <= 30
list1[i] 和 list2[i] 由空格 ' ' 和英文字母组成。
list1 的所有字符串都是 唯一 的。
list2 中的所有字符串都是 唯一 的。
二、题解:
1.解读 本质上是从两个字符串数组内查询相同的字符串元素,数组内的字符串元素没有重复的,同时这两个相同字符串元素所在下标之和为最小,如果有多个最小的下标之后就要获取多个。
方法一
简单的可以双重循环两个数组元素,找到最小的下标之和相同的元素,是为时间换空间。同样可以牺牲一点空间,换取时间上快速的查询。首先可以使用一个哈希表存储数组一的字符串元素,哈希表的key存储元素值,value存储元素下标。同时需要一个变量minIndex记录最小的下标之和,初始可以设置为大于题目限定的数组最大长度值,或者直接赋值整形最大值。然后再遍历数组二的字符串元素,O(1)的时间复杂度查询数组二的当前元素是否存在数组一(就是哈希表)中,不存在就继续判断数组二的下一个元素,存在的话获取数组二当前元素下标与哈希表中相同元素的下标之和index。判断如果index等于最小下标之和minIndex,说明最终答案可能不止一个就将当前元素添加到结果数组中。然后如果index<minIndex,说明当前元素的下标之和更小,只需要保留当前元素,所以将之前保存的结果数组清空,再添加上当前元素,同时更新最小下标之和minIndex = index。遍历数组二元素过程中如果发现当前元素的下标比最小下标之和大的时候就可以结束遍历了,后面不可能存在小于最小下标之和的相同元素了,最后返回结果数组即可。
三、代码:
方法一 Java代码
class Solution {
public String[] findRestaurant(String[] list1, String[] list2) {
List<String> restaurant = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < list1.length; i++) {
map.put(list1[i], i);
}
int minIndex = Integer.MAX_VALUE;
for (int i = 0; i < list2.length; i++) {
if (i > minIndex) {
break;
}
String str = list2[i];
if (!map.containsKey(str)) {
continue;
}
int index = map.get(str) + i;
if (index == minIndex) {
restaurant.add(str);
}
if (index < minIndex) {
restaurant.clear();
restaurant.add(str);
minIndex = index;
}
}
return restaurant.toArray(new String[0]);
}
}
时间复杂度:O(n),一次遍历数组一存储元素到哈希表,一次遍历数组二O(1)查询哈希表相同元素。
空间复杂度:O(n),额外需要一个哈希表存储数组元素。