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

90 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

1.描述

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.分析

利用变量min_index_sum记录当前的的最小索引和

对于Andy的每一餐厅,遍历Doris的列表,查找是否存在该餐厅,不存在继续Andy的下一个餐厅,否则:

  • 当前索引和大于当前的记录,则忽略该餐厅
  • 当前的索引和小于当前的记录,则更新当前最小索引和记录,并清空结果数组,将当前餐厅加入
  • 当前索引和等于记录,则将当前餐厅加入结果数组

优化

可以使用哈希map记录Andy的餐厅和对应的下标

然后遍历Doris的列表中的每一元素,如果元素存在于哈希map中,则进行暴力中同样的操作方法

3.AC代码

 class Solution {
public:
    vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
        //建立符号表
        unordered_map<string, int> st;
        for (int i = 0; i < list1.size(); ++i) {
            st[list1[i]] = i;
        }
        //遍历并更新
        int min_index_sum = INT_MAX;
        vector<string> ans;
        for (int i = 0; i < list2.size(); ++i) {
            if (st.count(list2[i])) {
                int index_sum = i + st[list2[i]];
                if (index_sum > min_index_sum) {  //如果下标差过大,则直接忽略
                    continue;
                }
                if (index_sum < min_index_sum) {  //如果下标差更小
                    min_index_sum = index_sum;
                    ans.clear();
                }
                ans.push_back(list2[i]);    //下标差小于等于当前记录都要将该餐厅添加到结果数组
            }
        }
        return ans;
    }
};