前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode-599-Minimum Index Sum of Two Lists

leetcode-599-Minimum Index Sum of Two Lists

作者头像
chenjx85
发布2018-05-22 16:39:09
4810
发布2018-05-22 16:39:09
举报

题目描述:

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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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中。

代码如下:(附解释)

代码语言:javascript
复制
    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清空,存入当前这个餐厅的名称。

代码如下:

代码语言:javascript
复制
    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。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述:
  • 要完成的函数:
  • 说明:
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档