本文最后更新于:2023年3月19日 晚上
Lt599. 两个列表的最小索引总和
假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。
你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设总是存在一个答案。
示例 1:
输入:
1 2 3 4
| ["Shogun", "Tapioca Express", "Burger King", "KFC"] ["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"] 输出: ["Shogun"] 解释: 他们唯一共同喜爱的餐厅是“Shogun”。
|
示例 2:
1 2 3 4 5
| 输入: ["Shogun", "Tapioca Express", "Burger King", "KFC"] ["KFC", "Shogun", "Burger King"] 输出: ["Shogun"] 解释: 他们共同喜爱且具有最小索引和的餐厅是“Shogun”,它有最小的索引和1(0+1)。
|
提示:
- 两个列表的长度范围都在 [1, 1000]内。
- 两个列表中的字符串的长度将在[1,30]的范围内。
- 下标从 0 开始,到列表的长度减 1。
- 两个列表都没有重复的元素。
思路
map 记录出现的索引,然后遍历另外一个列表,计算索引之和,如果小于当前记录的就更新 res 数组,等于的话就把当前数 push 进数组中,最后返回即可。
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
var findRestaurant = function (list1, list2) { let res = [], min = Infinity; const map = {}; const list = list1.length > list2.length ? list1 : list2; const maxList = list1.length > list2.length ? list2 : list1; for (let i = 0; i < list.length; i++) { const item = list[i]; map[item] = i; } for (let i = 0; i < maxList.length; i++) { const item = maxList[i]; const index = map[item]; if (typeof index !== "number") continue; const sum = index + i; if (sum < min) { res = [item]; min = sum; } else if (sum === min) { res.push(item); } } return res; };
|