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 条评论
登录 后参与评论

相关文章

来自专栏函数式编程语言及工具

Scalaz(17)- Monad:泛函状态类型-State Monad

  我们经常提到函数式编程就是F[T]。这个F可以被视为一种运算模式。我们是在F运算模式的壳子内对T进行计算。理论上来讲,函数式程序的运行状态也应该是在这个运算...

2998
来自专栏数据结构与算法

洛谷 P2679 子串

题目背景 无 题目描述 有两个仅包含小写英文字母的字符串 A 和 B。现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 ...

3214
来自专栏菩提树下的杨过

Flash/Flex学习笔记(8):ActionScript3.0中的面对对象

首先要习惯AS3.0的几个BT约定: 1.一个.as文件中,只能定义一个类 2.类名称必须与.as的文件名相同 3.类定义中必须要有package包声明 4.一...

1779
来自专栏大大的微笑

JUC包下的CountDownLatch,CyclicBarrier,Semaphore

①.从CountDownLatch的设计来看,可以做汇总的操作,例如计算员工工资,这边启动多个线程同时计算等所有线程执行完毕之后,计算需要发放的总额 final...

2298
来自专栏java达人

js的回调函数详解

在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用。既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递...

3105
来自专栏Create Sun

python 3.x 与2.x的区别

前言   保持学习的态度,学一门动态语言其实是很早以前的就准备要做的事情,当时还在纠结python与ruby。现在不单单是要学python,还在考虑用它做点什么...

4158
来自专栏流浪猫的golang

golang 的container/list (一)

问题1:有了slice,还要list做什么? 问题2:list的底层实现是什么? 带着这两个问题来什么有浅入深的学习golang 语言 。 首先来看...

1042
来自专栏iOS122-移动混合开发研究院

【读书笔记】A Swift Tour

素材:A Swift Tour 推荐下载Playground:Download Playground objc 自己较为熟悉,想熟悉下风头正劲的 swift。就...

3588
来自专栏Ryan Miao

Java String.split()用法小结

在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1、如果用“.”作为分隔的话,必...

34111
来自专栏web前端教室

javascript 红皮高程(9)

这两天把JS的Number类型过了一遍,真是遍地是坑啊,如果这里出一些面试题,我100%要栽在这里。 NaN,undefined,null,Infinity,i...

2498

扫码关注云+社区

领取腾讯云代金券