专栏首页chenjx85的技术专栏leetcode-599-Minimum Index Sum of Two Lists

leetcode-599-Minimum Index Sum of Two Lists

题目描述:

Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of favorite restaurants represented by strings.

You need to help them find out their common interest with the least list index sum. If there is a choice tie between answers, output all of them with no order requirement. You could assume there always exists an answer.

Example 1:

Input:
["Shogun", "Tapioca Express", "Burger King", "KFC"]
["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]
Output: ["Shogun"]
Explanation: The only restaurant they both like is "Shogun".

Example 2:

Input:
["Shogun", "Tapioca Express", "Burger King", "KFC"]
["KFC", "Shogun", "Burger King"]
Output: ["Shogun"]
Explanation: The restaurant they both like and have the least index sum is "Shogun" with index sum 1 (0+1).

Note:

  1. The length of both lists will be in the range of [1, 1000].
  2. The length of strings in both lists will be in the range of [1, 30].
  3. The index is starting from 0 to the list length minus 1.
  4. No duplicates in both lists.

要完成的函数:

vector<string> findRestaurant(vector<string>& list1, vector<string>& list2)

说明:

1、给定两个vector,里面分别存储两个人的喜好餐厅名字,最开始是最喜欢的,接下来其次……这样子排列下去。

要求找到两个人的共同喜好餐厅,并且要尽可能找到两个人最喜欢的。如果喜欢程度相同的话,可能会有多个餐厅名字。

2、首先,如果想要花费时间够少,我们可以增加空间复杂度,使用map来存储给定vector中的餐厅名字和餐厅的喜好顺序。

先遍历一遍第一个vector,存储所有餐厅的名称和喜好顺序在map中。接着遍历第二个vector,如果餐厅名字在map中,那么计算喜好顺序的和,存储整个过程中的最小的喜好顺序的和。

最后,再遍历一遍第二个vector,再计算一遍喜好顺序的和,如果等于这个最小值,那么存储在最终要返回的vector中。

代码如下:(附解释)

    vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) 
    {
        unordered_map<string,int>m1;//使用unordered_map速度更快
        int min1=INT_MAX;
        int j,t;
        vector<string>res;
        for(int i=0;i<list1.size();i++)//存储餐厅名称和喜好顺序
            m1[list1[i]]=i;
        for(int i=0;i<list2.size();i++)
        {
            if(m1.count(list2[i])==0)//如果没有出现过,那么不是共同餐厅
                continue;
            else 
                min1=min(min1,m1[list2[i]]+i);//存储最小的喜好顺序的和
        }
        for(int i=0;i<list2.size();i++)
        {
            if(m1.count(list2[i])==0)//如果没有出现过,那么不是共同餐厅
                continue;
            else
            {
                if((m1[list2[i]]+i)==min1)//如果等于最小值,那么存储
                    res.push_back(list2[i]);
            }   
        }
        return res;
    }

上述代码十分易懂,思路也很直接,实测106ms,beats 54.32% of cpp submissions。

3、改进:

上述代码中,我们遍历了两次第二个vector,第一次遍历是计算喜好顺序之和,存储整个过程的最小值;第二次遍历是计算喜好顺序之和,如果和等于最小值,那么存入res中。

那我们可不可以只计算一次喜好顺序之和,不要做第二次重复的运算?

我们可以在遍历的过程中,依然存储和的最小值,然后碰到下一家餐厅,按照如下方法处理:

如果下一家餐厅的喜好顺序之和,大于最小值,那么跳过这家餐厅。

如果下一家餐厅的喜好顺序之和,等于最小值,那么把餐厅的名称存入res中。

如果下一家餐厅的喜好顺序之和,小于最小值,那么把当前res清空,存入当前这个餐厅的名称。

代码如下:

    vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) 
    {
        vector<string>res;
        unordered_map<string,int>m1;
        int min1=INT_MAX;
        for(int i = 0; i < list1.size(); i++) 
            m1[list1[i]] = i;
        for(int i = 0; i < list2.size(); i++)
        {
            if(m1.count(list2[i]) != 0)
            {
                if(m1[list2[i]] + i < min1) 
                {
                    min1=m1[list2[i]] + i;
                    res.clear();
                    res.push_back(list2[i]);
                }   
                else if(m1[list2[i]] + i == min1) 
                    res.push_back(list2[i]);
            }
                
        }
        return res;
    }

上述代码实测92ms,beats 89.75% of cpp submissions。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 终于找到miniblink播放jwplayer不了的原因了

    起因是网友“国王与乞丐”反馈的http://lpl.qq.com/es/live.shtml页面播放不了flash。

    龙泉寺扫地僧
  • 【SQL】小心在循环中声明变量——浅析SQL变量作用域

    如果你认为这个语句跑起来没问题,那你值得看下去,会避免以后踩到【SQL变量作用域】的坑。

    AhDung
  • VS 2013 打包程序教程

    如果你只是想要在他人的机子上运行你的程序而不想安装,有一种简单的方法,只要使用本教程的“步骤—3.生成Release 文件夹”即可。但是有一点需要注意,如果你在...

    用户3148308
  • JNI编程demo

    每隔一秒产生一个随机数,就设定为压力值,然后在ProgressBar上显示出来。一般来讲用java也能做,但这次用jni来做 先定义一个操作类

    刘晓杰
  • 团队效率工具: 代码格式化之Clang-format

    平时团队进行合作的时候需要注意代码的格式,虽然很难统一每个人的编码风格,但是通过工具能够很好的管理代码格式。这里介绍下clang-format,它是基于clan...

    程序手艺人
  • C#脚本实践(三): 集成到游戏

    至此, C#做为脚本已经完全可行了: 可嵌入, 跨平台, 高效率, 热更新, 几乎可以忽略的编译时间, 强大的IDE支持, 丰富的第三方库, 部分动态语言特性的...

    逍遥剑客
  • 编程小知识之 Dispose 模式

    之前对 C# 中的 Dispose 模式只有些模糊印象,近来又了解了一些相关知识,在此简单做些记录~

    用户2615200
  • C/C++常见错误汇总

    出错原因: main.cpp中没有找到对应的函数名声明,没有在.cpp引用包含该函数名的头文件.h。 解决方法: 引入对应头文件。

    城市中的游牧民族
  • C++函数模板与分离编译模式

    一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件连接起来形成单一的可执行文件的过程称为分离编译模式。

    Dabelv
  • C#正则表达式判断字符串中是否有数…

                    int count = Regex.Matches(test, @"\d").Count;

    Dabelv

扫码关注云+社区

领取腾讯云代金券