739.每日温度 496.下一个更大元素 I

news2024/9/24 15:28:28

739.每日温度 496.下一个更大元素 I

739.每日温度

力扣题目链接(opens new window)

请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

思路

思路:单调栈
题目的暴力算法很好想,双重for循环遍历即可,这里就不多介绍了。介绍下单调栈思路
所谓单调栈,就是栈内元素单调。要么递增要么递减。那么单调栈的使用场景是什么呢?
通常是一维数组,要寻找任意元素,左右两边第一个比其大或者比其小的元素位置,就可用单调栈
本题目是找到当前元素右侧第一个比其大元素位置,可用单调栈思路
单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。
使用单调栈注意两点
1.单调栈内存储数组元素下标
2.单调栈内存储元素的顺序如何确认?这里指的顺序【从栈头到栈底的顺序】。对于本题目要使用递增循序(再强调一下是指从栈头到栈底的顺序),
即如果求元素右边第一个比其大的元素位置,那么单调栈递增。求元素右边第一个比其小的元素位置,那么单调栈递减。
使用单调栈主要有三个判断条件。
-当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
-当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
-当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
看文字不太好理解这三个判断条件,举例画图理解。temperatures = [73, 74, 75, 71, 71, 72, 76, 73]为例来逐步分析,输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

首先先将第一个遍历元素加入单调栈

在这里插入图片描述


加入T[1] = 74,因为T[1] > T[0](当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况)。

我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。

在这里插入图片描述


加入T[2],同理,T[1]弹出

在这里插入图片描述


加入T[3],T[3] < T[2] (当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况),加T[3]加入单调栈。

在这里插入图片描述


加入T[4],T[4] == T[3] (当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况),此时依然要加入栈,不用计算距离,因为我们要求的是右面第一个大于本元素的位置,而不是大于等于!

在这里插入图片描述


加入T[5],T[5] > T[4] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[4]弹出,同时计算距离,更新result 在这里插入图片描述


T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[3]继续弹出,同时计算距离,更新result 在这里插入图片描述


直到发现T[5]小于T[st.top()],终止弹出,将T[5]加入单调栈

在这里插入图片描述


加入T[6],同理,需要将栈里的T[5],T[2]弹出

在这里插入图片描述


同理,继续弹出

在这里插入图片描述


此时栈里只剩下了T[6]

在这里插入图片描述


加入T[7], T[7] < T[6] 直接入栈,这就是最后的情况,result数组也更新完了。

在这里插入图片描述

此时有同学可能就疑惑了,那result[6] , result[7]怎么没更新啊,元素也一直在栈里。

其实定义result数组的时候,就应该直接初始化为0,如果result没有更新,说明这个元素右面没有更大的了,也就是为0。

时间复杂度:O(n)
空间复杂度:O(n)

代码如下

public static void main(String args[]) {
    int[] temperatures = new int[]{73, 74, 75, 71, 69, 72, 76, 73};
    dailyTemperatures(temperatures);
}

public static int[] dailyTemperatures(int[] temperatures) {
    if (temperatures == null)
        return null;
    int[] result = new int[temperatures.length];
    Stack<Integer> stack = new Stack<>();// 单调递增(从栈头到栈底),存储数组元素下标
    stack.push(0);
    for (int i = 1; i < temperatures.length; i++) {
        int topElement = stack.peek();

        while (temperatures[i] > temperatures[topElement]) {

            Integer dropElement = stack.pop();
            result[dropElement] = i - dropElement;
            if (stack.isEmpty()) {// 栈内无元素可出栈
                break;
            }
            topElement = stack.peek();
        }
        stack.push(i);

    }
    return result;
}

496.下一个更大元素 I

力扣题目链接(opens new window)

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

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

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

示例 1:

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

示例 2:
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。
对于 num1 中的数字 4 ,第二个数组中没有下一个更大的数字,因此输出-1 。

提示:

  • 1 <= nums1.length <= nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 10^4
  • nums1和nums2中所有整数 互不相同
  • nums1 中的所有整数同样出现在 nums2 中

思路

单调栈
本题目和【739. 每日温度】一样均使用单调栈解决,但要处理nums1和nums2之间映射关系,导致本题难度偏高一些
如果做过【739. 每日温度】,那么求出Nums2的每个元素在 nums2 中的下一个比其大的值,还是很简单的
题目要求找出 nums1 中每个元素在 nums2 中的下一个比其大的值。两者之间映射关系如何确定呢?我第一次做也搞不明白怎么映射。看了下题解可以使用hashMap
使用map的key存储nums[i],value存储i.根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过。
题目说如果不存在对应位置就输出 -1 ,所以定义的result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。
时间复杂度:O(n)
空间复杂度:O(n)

代码如下

public static void main(String args[]) {
    int[] nums1 = new int[]{4, 1, 2};
    int[] nums2 = new int[]{1, 3, 4, 2};
    nextGreaterElement(nums1, nums2);
}


public static int[] nextGreaterElement(int[] nums1, int[] nums2) {
    if (nums1 == null || nums2 == null)
        return null;
    Map<Integer, Integer> map = new HashMap<>();// 保存nums1的value 和下标i
    for (int i = 0; i < nums1.length; i++) {
        map.put(nums1[i], i);
    }

    int[] nums1Result = new int[nums1.length];// 保存Nums1每一个元素右侧第一个比其大的元素value
    // 初始化value为-1
    Arrays.fill(nums1Result, -1);
    Stack<Integer> stack = new Stack<>();
    stack.push(0);
    for (int i = 1; i < nums2.length; i++) {
        int stackTop = stack.peek();
        while (nums2[i] > nums2[stackTop]) {
            stackTop = stack.pop();

            if (map.containsKey(nums2[stackTop])) {
                nums1Result[map.get(nums2[stackTop])] = nums2[i];
            }
            if (stack.isEmpty())
                break;
            stackTop = stack.peek();
        }
        stack.push(i);
    }


    return nums1Result;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1397576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(初研) Sentence-embedding fine-tune notebook

由于工作需要&#xff0c;需要对embedding模型进行微调&#xff0c;我调用了几种方案&#xff0c;都比较繁琐。先记录一个相对简单的方案。以下内容并不一定正确&#xff0c;请刷到的大佬给予指正&#xff0c;不胜感激&#xff01;&#xff01;&#xff01; 一.对BGE模型&…

OpenHarmonyOS-gn与Ninja

GN语法及在鸿蒙的使用 [gnninja学习 0x01]gn和ninja是什么 ohos_sdk/doc/subsys-build-gn-coding-style-and-best-practice.md GN 语言与操作 一、gn简介 gn是generate ninja的缩写&#xff0c;它是一个元编译系统&#xff08;meta-build system&#xff09;,是ninja的前端&am…

Python入门到精通(三)——Python循环语句

Python循环语句 一、while 循环 1、基础语法 2、嵌套应用 二、for 循环 1、基础语法 2、嵌套应用 三、循环中断&#xff1a;break 和 continue 1、break 2、continue 四、综合案例 一、while 循环 1、基础语法 while的条件需得到布尔类型&#xff0c;True表示继续循环…

linux C语言socket函数send

在Linux中&#xff0c;使用C语言进行网络编程时&#xff0c;send函数是用于发送数据到已连接的套接字的重要函数之一。它通常用于TCP连接&#xff0c;但也可以用于UDP&#xff08;尽管对于UDP&#xff0c;通常更推荐使用sendto&#xff0c;因为它允许你指定目标地址和端口&…

定时关机应用V2.1

# 在ShutDown_2.0的基础上&#xff0c;作了如下改进&#xff1a; # 1) 修正了默认模式无法选择其他时间的bug&#xff0c;还增加了2.5小时和3小时两个选项&#xff1b; # 2&#xff09;自定义模式将计时单位从“秒”改为“分钟”&#xff0c;倒计时显示也优化为“小时:分钟:秒”…

小白水平理解面试经典题目LeetCode 125 Valid Palindrome(验证回文串)

125 验证回文串 说到公司面试&#xff0c;那就是得考出高度&#xff0c;考出水平&#xff0c;什么兼顾这两者呢&#xff0c;那就得看这道 原题描述&#xff1a; 给定一个字符串&#xff0c;判断它是否是回文串。回文串是指正读和反读都一样的字符串。 输入: “A man, a pla…

JS-WebAPIS(四)

日期对象&#xff08;常用&#xff09; • 实例化 在代码中发现了 new 关键字时&#xff0c;一般将这个操作称为实例化创建一个时间对象并获取时间 获得当前时间 获得指定时间 • 时间对象方法 使用场景&#xff1a;因为日期对象返回的数据我们不能直接使用&#xff0c;所以…

Android Studio安卓开发--ListView学习整理

ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内&#xff0c;同时屏幕上原有的数据则会滚动出屏幕。 1.ListView的简单用法 &#xff08;1&#xff09;activity_main.xml布局中加入ListView控件&#xff1a;&#xff08;先占满整个布局的空间&#xff09;…

网络安全与人工智能的交叉点

网络安全和人工智能 (AI) 的联系日益紧密&#xff0c;人工智能在增强网络安全措施方面发挥着重要作用。这种集成并不新鲜&#xff0c;但随着技术的进步和网络威胁变得更加复杂&#xff0c;它已经随着时间的推移而发展。 在网络安全的早期&#xff0c;防火墙和防病毒软件等传统…

用git bash调用md5sum进行批量MD5计算

对于非常大的文件或者很重要的文件&#xff0c;在不稳定的网络环境下&#xff0c;可能文件的某些字节会损坏。此时&#xff0c;对文件计算MD5即可以校验其完整性。比如本次的 OpenStreetMap 导出包&#xff0c;我的学弟反馈通过网盘下载无法解压&#xff0c;并建议我增加每个文…

uni-app使用HBuilderX打包Web项目

非常简单&#xff0c;就是容易忘记 一、找到manifest.json配置Web配置 二、源码视图配置 "h5" : {"template" : "","domain" : "xxx.xx.xx.xxx","publicPath" : "./","devServer" : {&quo…

如何启动Windows平台轻量级RTSP服务生成RTSP拉流URL

为满足内网无纸化/电子教室等内网超低延迟需求&#xff0c;避免让用户配置单独的服务器&#xff0c;我们在推送端发布了轻量级RTSP服务模块&#xff1a; 简单来说&#xff0c;之前推送端SDK支持的功能&#xff0c;内置轻量级RTSP服务模块后&#xff0c;功能继续支持。 轻量级…

00-Rust前言

问&#xff1a;为什么要近期想学习Rust? 答&#xff1a; Rust出来也是有一段时间了&#xff0c;从Microsoft吵着要重构他们的C"祖传代码"开始&#xff0c;Rust就披着“高效&#xff0c;安全”的头衔。而自己决定要学习Rust&#xff0c;是因为近期发现&#xff1a;与…

git本地分支的合并

目录 第一章、本地分支的切换测试1.1&#xff09;切换之前的master分支下文件内容1.2&#xff09;切换到develop分支后修改文件1.3&#xff09;切回master分支出现报错&#xff1a;1.4&#xff09;报错分析 第二章、解决方式2.1&#xff09;方式1&#xff1a;commit2.2&#xf…

线程同步--生产者消费者模型--单例模式线程池

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器基于生产者消费者模型实现单例线程池 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件…

[已解决]前端使用el-upload,后端使用文件上传阿里云报错:异常信息:java.lang.NullPointerException: null

前端使用el-upload&#xff0c;后端使用文件上传阿里云报错&#xff1a; 报错原因&#xff1a;前端image参数未传进去 解决方法&#xff1a;在el-upload添加属性 name"image" 文件传进去了&#xff01;

Redis实战之-分布式锁-redission

一、分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff0c;可重入锁的意义在于防止死锁&#xff0c;比如HashTable这样的代码中&#xff0c;他的方法都…

2.4 网络层03

2.4 网络层03 2.4.7 路由表 1、什么是路由&#xff1f; 路由就是报文从源端到目的端的路径。当报文从路由器到目的网段有多条路由可达时&#xff0c;路由器可以根据路由表中最佳路由进行转发。 2、什么是路由表&#xff1f; 在计算机网络中&#xff0c;路由表&#xff08…

关于java中的Super详解

关于java中的Super详解 我们在上一篇文章中了解到了面向对象三大基本特征&#xff0c;继承&#xff0c;我们本篇文章中来了解一下Super&#x1f600;。 一、Super和this调用属性 this&#xff1a;当前类中使用。super&#xff1a;父类使用。 我们直接用代码来说明一下。 1…