496.下一个更大元素I

知识点:栈;HashMap;

题目描述

给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1

示例
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。
对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。
对于 num1 中的数字 2 ,第二个数组中没有下一个更大的数字,因此输出 -1 。
提示
  • num1和num2中所有整数互不相同

解法一:暴力法

直接遍历数组1,然后对于数组2从后往前找。

class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] maxArray = new int[nums1.length];
int j = nums2.length;
int max = -1;
for(int i = 0; i < nums1.length; i++){
while(nums2[j-1] != nums1[i]){
if(nums2[j-1] > nums1[i]) max = nums2[j-1];
j--;
}
maxArray[i] = max;
max = -1;
j = nums2.length;
}
return maxArray;
}
}

时间复杂度:O(MN);

解法二:单调栈+哈希表

这道题目可以采用单调栈的方法,什么是单调栈呢,就是保证栈从上到下是单调的。

所以这道题目可以这样:我们先遍历nums2数组,从头开始,如果遍历到的元素大于栈顶的元素,那证明这就是栈顶元素对应的那个下一个比它更大的元素,用hashmap把它存起来,如果不是,那就也把这个元素压栈;这时候压栈的都是小于栈顶元素的,所以栈其实是单调的,直到找到比它大的,这时候这个元素也是比栈里所有元素都大的。然后再对应nums1去在hashmap里寻找就可以了;

class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
Stack<Integer> stack = new Stack<>();
Map<Integer,Integer> hashMap = new HashMap<>();
for(int i = 0; i < nums2.length; i++){
if(stack.isEmpty()) stack.push(nums2[i]);
while(!stack.isEmpty() && nums2[i] > stack.peek()){
hashMap.put(stack.pop(),nums2[i]);
}
stack.push(nums2[i]);
}
int[] maxArray = new int[nums1.length];
for(int i = 0; i < nums1.length; i++){
maxArray[i] = hashMap.getOrDefault(nums1[i], -1); //注意这个方法
}
return maxArray;
}
}

时间复杂度:O(N+M):对于两个数组各遍历一次就可以了;

体会

学会这种单调栈的思想,其次要学会用hashMap;

【LeetCode】496.下一个更大元素I的更多相关文章

  1. LeetCode 496. 下一个更大元素 I(Next Greater Element I) 35

    496. 下一个更大元素 I 496. Next Greater Element I 题目描述 给定两个没有重复元素的数组 nums1 和 nums2,其中 nums1 是 nums2 的子集.找到  ...

  2. Java实现 LeetCode 496 下一个更大元素 I

    496. 下一个更大元素 I 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nu ...

  3. Leetcode 496. 下一个更大元素 I

    1.题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字  ...

  4. LeetCode 556. 下一个更大元素 III(Next Greater Element III)

    556. 下一个更大元素 III 556. Next Greater Element III 题目描述 给定一个 32 位正整数 n,你需要找到最小的 32 位整数,其与 n 中存在的位数完全相同,并 ...

  5. LeetCode 503. 下一个更大元素 II(Next Greater Element II)

    503. 下一个更大元素 II 503. Next Greater Element II 题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 ...

  6. LeetCode:下一个更大元素I【31】

    LeetCode:下一个更大元素I[31] 题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的 ...

  7. 496. 下一个更大元素 I

    496. 下一个更大元素 I 给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. ...

  8. Leetcode 503. 下一个更大元素 II

    1.题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应 ...

  9. Leetcode---栈系列刷题(python3实现)----#496 下一个更大元素I

    给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更 ...

随机推荐

  1. PyTorch全连接ReLU网络

    PyTorch全连接ReLU网络 1.PyTorch的核心是两个主要特征: 一个n维张量,类似于numpy,但可以在GPU上运行 搭建和训练神经网络时的自动微分/求导机制 本文将使用全连接的ReLU网 ...

  2. CUDA运行时 Runtime(三)

    CUDA运行时 Runtime(三) 一.异步并发执行 CUDA将以下操作公开为可以彼此并发操作的独立任务: 主机计算: 设备计算: 从主机到设备的内存传输: 从设备到主机的存储器传输: 在给定设备的 ...

  3. GitHub上开源的YOLOv5

    GitHub上开源的YOLOv5 代码地址:https://github.com/ultralytics/YOLOv5 该存储库代表Ultralytics对未来的对象检测方法的开源研究,并结合了我们在 ...

  4. 笔记-13-多线程 Thread方法 线程安全 生产者和消费者 死锁和阻塞 练习

    题目1 编写程序,创建两个线程对象,一根线程循环输出"播放背景音乐",另一根线程循环输出"显示画面";要求: 1: 1个线程使用Runnable接口的匿名内部类 ...

  5. 【SQLite】教程06-SQLite表操作

    创建表: CREATE TABLE 语句用于在任何给定的数据库创建一个新表.命名表.定义列.定义每一列的数据类型 查看表: 详细查看表: 重命名表: 删除表: 创建表并添加7条记录(第七条记录用了第二 ...

  6. 关于spooling的一些理解

    spooling做了什么 1.将独占设备(打印机)虚拟化,变成一个逻辑上的共享设备. 怎么理解?虚拟化,通俗来讲,就是让单个资源仿似变成了多个资源. 以打印机为例,没有虚拟化之前,只能有一个进程申请到 ...

  7. 《Docker基础与实战,看这一篇就够了》

    什么是Docker? Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术 ...

  8. Win32Api -- 使应用Always on top的几种方法

    本文介绍几种使应用一直置于顶层的方法. 问题描述 一般情况下,想要将应用置于顶层,设置其TopMost属性为true即可.对于多个设置了TopMost属性的应用,后激活的在上面. 但有的应用,比如全局 ...

  9. Pytest学习笔记10-生成html报告

    前言 在pytest中,如何生成html测试报告呢,pytest提供了pytest-html插件,可以帮助我们生成测试报告,当然,如果希望生成更加精美的测试报告,我们还可以使用allure生成报告,下 ...

  10. POJ 1654 Area 多边形面积 G++会WA

    #include<stdio.h> #include<algorithm> #include <cstring> using namespace std; type ...