开启我的LeetCode刷题日记:599. 两个列表的最小索引总和

110 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:599. 两个列表的最小索引总和

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

我的思路

首先把一个列表遍历存到一个对象中,作为hash对照使用

然后定义两个变量,一个存储当前最小的索引和,一个存储符合这个索引和的字符串 遍历另一个列表,找到

3.1 在 hash 中存在的,同时索引和小于当前最小的索引和的,更新 2.的两个变量

3.2 在 hash 中存在的,同时索引和等于当前最小的索引和的,更新 存储这个索引和字符串的变量 返回符合条件的索引和子串

代码实现

/**
 * @param {string[]} list1
 * @param {string[]} list2
 * @return {string[]}
 */
var findRestaurant = function (list1, list2) {
  const map = {};
  list1.forEach((item, idx) => {
    map[item] = idx
  })
  let min = 2000
  let minArr = []
  list2.forEach((item, idx) => {
    if (map[item] !== undefined) {
      if (map[item] + idx < min) {
        min = map[item] + idx
        minArr = [item]
      } else if (map[item] + idx === min) {
        minArr.push(item)
      }
    }
  })
  return minArr
};

总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹