LeetCode算法题-Next Greater Element I(Java实现)
这是悦乐书的第244次更新,第257篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第111题(顺位题号是496)。你有两个数组(没有重复)nums1和nums2,其中nums1的元素是nums2的子集。在nums2的相应位置找到nums1元素的所有下一个更大的数字。nums1中的数字x的下一个更大数字是nums2中右边第一个更大的数字。如果它不存在,则输出该数字的-1。例如:
输入:nums1 = [4,1,2],nums2 = [1,3,4,2]。
输出:[-1,3,-1]
说明:对于第一个数组中的数字4,在第二个数组中找不到下一个更大的数字,因此输出-1。对于第一个数组中的数字1,第二个数组中的下一个更大数字是3。对于第一个数组中的数字2,第二个数组中没有下一个更大的数字,因此输出-1。
输入:nums1 = [2,4],nums2 = [1,2,3,4]。
输出:[3,-1]
说明:对于第一个数组中的数字2,第二个数组中的下一个更大数字是3。对于第一个数组中的数字4,第二个数组中没有下一个更大的数字,因此输出-1。
注意:
nums1和nums2中的所有元素都是唯一的。
nums1和nums2的长度不会超过1000。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
暴力解法。使用两层循环,先找到nums1的元素在nums2中的对应元素,然后从nums2中找到的元素的下一位往右开始判断,找到比当前元素大的元素,找得到就将其作为结果数组的元素添加进去,否则就将-1添加进结果数组。
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] result = new int[nums1.length];
for (int i=0; i<nums1.length; i++) {
int j = 0, k = 0;
for (; j<nums2.length; j++) {
if (nums1[i] == nums2[j]) {
break;
}
}
for (k = j+1; k<nums2.length; k++) {
if (nums2[k] > nums2[j]) {
result[i] = nums2[k];
break;
}
}
if (k == nums2.length) {
result[i] = -1;
}
}
return result;
}
03 第二种解法
我们可以将第一种方法进行优化,将nums2中的元素作为key、索引作为value存入HashMap,在原来第一种解法中每次通过循环来定位nums2中的索引位置,换成了通过key查找value的映射,获取到索引后,从索引后一位开始依次寻找比nums1的当前元素大的数字,找得到就替换已经设值为-1的结果数组的元素值。
public int[] nextGreaterElement2(int[] nums1, int[] nums2) {
int[] result = new int[nums1.length];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0; i<nums2.length; i++) {
map.put(nums2[i], i);
}
for (int j=0; j<nums1.length; j++) {
result[j] = -1;
int index = map.get(nums1[j]);
for (int k = index + 1; k<nums2.length; k++) {
if (nums2[k] > nums1[j]) {
result[j] = nums2[k];
break;
}
}
}
return result;
}
04 第三种解法
使用HashMap和栈。在第二种解法中我们使用HashMap存的是nums2的值、索引,在此解法中,我们使用HashMap存的是,如果nums2的当前元素存在右边最大数,上一个元素为key,当前元素为value。
在遍历nums2中的元素时,如果栈不为空,并且当前栈顶的值小于当前元素,即nums2的前一个元素存在右边最大数,此时,我们需要将栈顶的元素作为key,当前元素作为value,存入HashMap中,同时,要将栈顶的元素移除,此操作是循环执行的。最后我们再将nums2的当前元素存入stack中。
接着,我们要开始处理nums1的数据了,遍历其中的元素,如果能够在HashMap中找到对应的值,就取其value作为结果数组的元素值,否则取-1作为默认值。
public int[] nextGreaterElement3(int[] nums1, int[] nums2) {
int[] result = new int[nums1.length];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Stack<Integer> stack = new Stack<Integer>();
for (int num : nums2) {
while (!stack.isEmpty() && stack.peek() < num) {
map.put(stack.pop(), num);
}
stack.push(num);
}
for (int i=0; i<nums1.length; i++) {
result[i] = map.getOrDefault(nums1[i], -1);
}
return result;
}
05 小结
算法专题目前已日更超过三个月,算法题文章111+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Next Greater Element I(Java实现)的更多相关文章
- LeetCode算法题-Kth Largest Element in a Stream(Java实现)
这是悦乐书的第296次更新,第315篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第164题(顺位题号是703).设计一个类来查找流中第k个最大元素.请注意,它是排序顺序 ...
- LeetCode算法题-Subdomain Visit Count(Java实现)
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
- LeetCode算法题-Letter Case Permutation(Java实现)
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...
- LeetCode算法题-Jewels and Stones(Java实现)
这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...
- LeetCode算法题-Reach a Number(Java实现)
这是悦乐书的第310次更新,第331篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754).你站在无限数字线的0号位置.在目的地有个target.在 ...
- LeetCode算法题-Shortest Completing Word(Java实现)
这是悦乐书的第309次更新,第330篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748).从给定的字典单词中查找最小长度单词,其中包含字符串lic ...
- LeetCode算法题-Self Dividing Numbers(Java实现)
这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...
- LeetCode算法题-Find Pivot Index(Java实现)
这是悦乐书的第304次更新,第323篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第172题(顺位题号是724).给定一个整数nums数组,编写一个返回此数组的" ...
- LeetCode算法题-To Lower Case(Java实现)
这是悦乐书的第301次更新,第320篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第169题(顺位题号是709).实现具有字符串参数str的函数ToLowerCase() ...
随机推荐
- Vue生命周期详解
Vue所有的生命周期钩子自动绑定在this上下文到实例中,因此你可以访问数据,对属性和方法进行运算.这意味着你不能使用箭头函数来定义一个生命周期方法.这是因为箭头函数绑定了父上下文,因此this与你期 ...
- Python爬虫入门教程 28-100 虎嗅网文章数据抓取 pyspider
1. 虎嗅网文章数据----写在前面 今天继续使用pyspider爬取数据,很不幸,虎嗅资讯网被我选中了,网址为 https://www.huxiu.com/ 爬的就是它的资讯频道,本文章仅供学习交流 ...
- TypeScript: type alias 与 interface
官方文档中有关于两者对比的信息,隐藏在 TypeScript Handbook 中,见 Interfaces vs. Type Aliases 部分. 但因为这一部分很久没更新了,所以其中描述的内容不 ...
- EF架构~mysql数据库无法创建数据模型
回到目录 主要是通过vs2017+mysql.Data+Mysql.data.Entity+ef 来进行开始,当我们选择数据模型生成实体时,可以会出现以下问题: http:// 解决办法: 1.安装 ...
- TCP/IP 四次断开
网络连接状态 网络连接状态(11种)非常重要这里既包含三次握手中的也包括四次断开中的,所以要熟悉. LISTEN 被动打开,首先服务器需要打开一个socket进行监听,监听来自远方TCP端口的连接请求 ...
- 由Nginx的DNS缓存导致的访问404
现象 访问某个URL出现404,而且全站都是404.通过日志查看Nginx的规则也正确,请求被代理到指定位置. 排查 最近针对这个站点没有修改过Nginx配置也没有站点升级.所以应该是其他原因.首先P ...
- JavaWeb中使用JSON
前言: 最近也是期末了,有好多好多文档和实验报告要交,所以都没啥时间写文,这段时间清闲了,来补一下之前学习时遗漏的一些知识树,话说就没人吐槽这个JSON图标好丑吗? 什么是JSON JSON 指的是 ...
- C语言数组操作和指针操作谁更高效
在上一篇博文 代码优化小技巧(持续更新......) 第三条关于数组和指针谁更高效, 意犹未尽, 决定单独拉出一篇来讲 1. 数组和指针操作对比 #include <stdio.h> i ...
- PE知识复习之PE的两种状态
PE知识复习之PE的两种状态 一丶熟悉PE的整体结构 从下面依次网上看.可以得出PE结构 其中DOS头有DOS头结构 也就是 IMAGE_DOS_HEADER 关于结构体的各项属性.前边已经写过了.本 ...
- Zookeeper注册中心和Dubbo-Admin管理平台的搭建
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...