这是悦乐书的第272次更新,第286篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第139题(顺位题号是599)。假设Andy和Doris想要选择一家餐馆吃晚餐,他们都有一个最受欢迎的餐馆列表。你需要用最少的列表索引总和帮助他们找出他们的共同兴趣。如果答案之间存在选择关系,则输出所有答案并且没有顺序要求。你可以假设总有一个答案。例如:

输入:

["Shogun", "Tapioca Express", "Burger King", "KFC"]

["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]

输出: ["Shogun"]

说明: 他们都喜欢的唯一一家餐厅是“Shogun”。



输入:

["Shogun", "Tapioca Express", "Burger King", "KFC"]

["KFC", "Shogun", "Burger King"]

输出: ["Shogun"]

说明: 他们喜欢并且索引总和最少的餐馆是“Shogun”,索引和1(0 + 1)。

注意

  • 两个列表的长度将在[1,1000]的范围内。

  • 两个列表中的字符串长度将在[1,30]的范围内。

  • 索引从0开始到列表长度减去1。

  • 两个列表中都没有重复项。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

使用两个HashMap,分别将list1和list2的元素存入其中,以元素值为key,索引为value。定义一个最小值min,初始值为int的最大值,然后遍历其中一个map的key值,如果第二个map中也存在该key,此时分为两种情况处理。

第一种情况,如果该key值对应两索引之和小于min,那么将min更新,再将结果数组清空,再将该key添加进结果数组。

第二种情况,如果该key值对应两索引之和等于min,表明存在另外一对索引之和,直接将key添加进结果数组即可。

最后返回结果数组。

public String[] findRestaurant(String[] list1, String[] list2) {
Map<String, Integer> map = new HashMap<>();
Map<String, Integer> map2 = new HashMap<>();
for(int i=0; i<list1.length; i++){
map.put(list1[i], i);
}
for(int i=0; i<list2.length; i++){
map2.put(list2[i], i);
}
int min = Integer.MAX_VALUE;
List<String> result = new ArrayList<>();
for (String key : map.keySet()) {
if (map2.containsKey(key)) {
if (map.get(key)+map2.get(key) < min) {
min = map.get(key)+map2.get(key);
result = new ArrayList<>();
result.add(key);
} else if (map.get(key)+map2.get(key) == min) {
result.add(key);
}
}
}
return result.toArray(new String[result.size()]);
}

03 第二种解法

我们可以将第一种解法再简化下,只使用一个HashMap,然后遍历剩下的那个数组,判断思路与第一种解法一致。同时,我们也可以将循环内部使用创建新对象来清空数组的方法,换成其自身的clear()方法。

public String[] findRestaurant2(String[] list1, String[] list2) {
Map<String, Integer> map = new HashMap<>();
for(int i=0; i<list1.length; i++){
map.put(list1[i], i);
}
int min = Integer.MAX_VALUE;
List<String> result = new ArrayList<>();
for (int i=0; i<list2.length; i++) {
if (map.containsKey(list2[i])) {
if (map.get(list2[i])+i < min) {
min = map.get(list2[i])+i;
result.clear();
result.add(list2[i]);
} else if (map.get(list2[i])+i == min) {
result.add(list2[i]);
}
}
}
return result.toArray(new String[result.size()]);
}

04 第三种解法

我们也可以不使用HashMap,直接使用for循环来解决。

public String[] findRestaurant3(String[] list1, String[] list2) {
int min = Integer.MAX_VALUE;
List<String> result = new ArrayList<>();
for (int i=0; i<list1.length; i++) {
for (int j=0; j<list2.length; j++) {
if (list1[i].equals(list2[j])) {
if (j+i < min) {
min = j+i;
result.clear();
result.add(list1[i]);
} else if (j+i == min) {
result.add(list1[i]);
}
}
}
}
return result.toArray(new String[result.size()]);
}

05 小结

算法专题目前已日更超过四个月,算法题文章139+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Minimum Index Sum of Two Lists(Java实现)的更多相关文章

  1. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

  2. LeetCode算法题-Minimum Absolute Difference in BST(Java实现)

    这是悦乐书的第253次更新,第266篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第120题(顺位题号是530).给定具有非负值的二叉搜索树,找到任意两个节点的值之间的最 ...

  3. LeetCode算法题-Minimum Depth of Binary Tree(Java实现)

    这是悦乐书的第168次更新,第170篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第27题(顺位题号是111).给定二叉树,找到它的最小深度.最小深度是沿从根节点到最近的 ...

  4. 【LeetCode】599. Minimum Index Sum of Two Lists 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:找到公共元素再求索引和 方法二:索引求和,使 ...

  5. LeetCode 题解之Minimum Index Sum of Two Lists

    1.题目描述 2.问题分析 直接是用hash table 解决问题 3.代码 vector<string> findRestaurant(vector<string>& ...

  6. 【Leetcode_easy】599. Minimum Index Sum of Two Lists

    problem 599. Minimum Index Sum of Two Lists 题意:给出两个字符串数组,找到坐标位置之和最小的相同的字符串. 计算两个的坐标之和,如果与最小坐标和sum相同, ...

  7. LeetCode算法题-Minimum Moves to Equal Array Elements(Java实现)

    这是悦乐书的第233次更新,第246篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第100题(顺位题号是453).给定大小为n的非空整数数组,找到使所有数组元素相等所需的 ...

  8. LeetCode算法题-Peak Index in a Mountain Array(Java实现)

    这是悦乐书的第329次更新,第352篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第199题(顺位题号是852).如果以下属性成立,我们将数组A称为山: A.length ...

  9. LeetCode算法题-Maximum Product of Three Numbers(Java实现)

    这是悦乐书的第275次更新,第291篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第143题(顺位题号是628).给定一个整数数组,从其中找出三个数,使得乘积最大.例如: ...

随机推荐

  1. redis 系列11 列表对象

    一. 列表对象概述 Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素到列表的头部(左边)或者尾部(右边).一个列表最多可以包含 232 - 1 个元素 (4294967295, ...

  2. Sdcard插拔、状态广播监听,Android文件系统,Android存储器相关知识总结

    一 SDcard广播监听,注册,取消注册的实现 (1)根据实际需要监听的事件,添加action,并注册,一般在onCreate中添加 //在IntentFilter中选择你要监听的行为 IntentF ...

  3. Solr 09 - SolrJ操作Solr单机服务 (Solr的Java API)

    目录 1 SolrJ是什么 2 SolrJ对索引的CRUD操作 2.1 创建Maven工程(打包方式选择为jar) 2.2 配置pom.xml文件, 加入SolrJ的依赖 2.3 添加和修改索引 2. ...

  4. 【SpringCloud Eureka源码】从Eureka Client发起注册请求到Eureka Server处理的整个服务注册过程(下)

    目录 一.Spring Cloud Eureka Server自动配置及初始化 @EnableEurekaServer EurekaServerAutoConfiguration - 注册服务自动配置 ...

  5. 分析core,是从案发现场,推导案发经过

    分析core不是一件容易的事情.试想,一个系统运行了很长一段时间,在这段时间里,系统会积累大量正常.甚至不正常的状态.这个时候如果系统突然出现了一个问题,那这个问题十有八九跟长时间积累下来的状态有关系 ...

  6. .NET Core中Object Pool的简单使用

    前言 复用,是一个重要的话题,也是我们日常开发中经常遇到的,不可避免的问题. 举个最为简单,大家最为熟悉的例子,数据库连接池,就是复用数据库连接. 那么复用的意义在那里呢? 简单来说就是减少不必要的资 ...

  7. 产品炼成记·hostingranking.cn·基于ghost的轻量技术架构整理

    本篇纯粹只讲hostingranking.cn网站的技术架构,也就是怎么做到的,达到什么效果.至于它是什么,为什么要做暂且不说,另篇会分享. 技术组成 首先hostingranking.cn是基于gh ...

  8. Python3+Selenium2完整的自动化测试实现之旅(三):Selenium-webdriver提供的元素定位方法

    本篇以实例介绍selenium下的webdriver模块提供的定位页面元素(也可以称为对象)的方法和使用技巧,在此注意:在做WEB自动化测试前,需要对前端相关的技术有所了解,如HTML.XML.Xpa ...

  9. Flask入门第三天

    一.数据库操作 1,orm orm(object-Relation Mapping),对象-关系映射,主要实现模型对象到关系数据库数据的映射. 优点: - 只需要面向对象编程, 不需要面向数据库编写代 ...

  10. CAN总线学习记录之二:系统结构与帧结构

    CAN总线系统结构 CAN 控制器  接收控制单元中微处理器发出的数据,处理数据并传给 CAN 收发器 CAN 收发器 将数据传到总线 or 从总线接收数据给 CAN 控制器 CAN 数据传递终端 避 ...