Day50:单调栈 LeedCode 739. 每日温度 496.下一个更大元素 I 503. 下一个更大元素 II

news2025/1/31 3:06:42

739. 每日温度

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

示例 2:

输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例 3:

输入: temperatures = [30,60,90]
输出: [1,1,0]

提示:

  • 1 <= temperatures.length <= 105
  • 30 <= temperatures[i] <= 100

思路:

首先想到的当然是暴力解法,两层for循环,时间复杂度是O(n^2)

单调栈的解法:时间复杂度为O(n)

什么时候用单调栈呢?

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。

单调栈的本质是空间换时间

首先要明确如下几点:

1.单调栈里存放的元素是什么?

单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。

2.单调栈里元素是递增呢? 还是递减呢?

使用递增循序(再强调一下是指从栈头到栈底的顺序)

图解:

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
    int[] result=new int[temperatures.length];
    List<Integer> list=new LinkedList<>();
    for(int i=0;i<temperatures.length;i++){
        while(list.size()>0&&temperatures[list.get(list.size()-1)]<temperatures[i]){
            int index=list.get(list.size()-1);
            result[index]=i-index;
            list.remove(list.size()-1);
        }
        list.add(i);
    }
    return result;
    }
}

496. 下一个更大元素 I

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

示例 1:

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。

示例 2:

输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。

提示:

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

进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?

思路:本题与上题思路一致,只是不是求nums2中所有数的下一个更大书,而是求其子集nums1中每个数的在nums2中的下一个更大数,所以我们要将nums1的值和坐标存下来

此外,本题求下一个更大数,不是求坐标,所以单调栈中存放数而不是坐标了

 
 
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums1.length; i++) {
            map.put(nums1[i], i);//记录下nums1中的数据以及它们对应的下标
        }
        int result[] = new int[nums1.length];
        //初始化
        Arrays.fill(result, -1);
        //单调栈
        List<Integer> list = new LinkedList<>();
        for (int i = 0; i < nums2.length; i++) {
            //当栈不为空,且nums2[i]>栈顶元素时,找到了栈顶元素的下一个更大值了
            while (list.size() > 0 && nums2[i] > list.get(list.size() - 1)) {
                //如果栈顶元素是nums1中的元素
                if (map.containsKey(list.get(list.size() - 1))) {
                    //记录下这个更大值
                    //求栈顶元素
                    int num = list.get(list.size() - 1);
                    //求栈顶元素在nums1中的位置,和记录结果
                    result[map.get(num)] = nums2[i];
                }
                list.remove(list.size() - 1);
            }
 
            list.add(nums2[i]);
        }
 
        return result;
    }
}

503. 下一个更大元素 II

给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

示例 1:

输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数; 
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

示例 2:

输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

提示:

  • 1 <= nums.length <= 104
  • -109 <= nums[i] <= 109

思路:本题与上题类似,可以将两个nums拼起来,然后利用单调栈求出每个数的下一个更大的数

class Solution {
    public int[] nextGreaterElements(int[] nums) {
    int[] result=new int[nums.length];
      List<Integer>list=new LinkedList<>();
      Arrays.fill(result,-1);
      for(int i=0;i<2*nums.length;i++){
        while(list.size()>0&&nums[i%nums.length]>nums[list.get(list.size()-1)]){
                 int index=list.get(list.size()-1);
                 result[index]=nums[i%nums.length];
                 list.removeLast();
        }
        list.add(i%nums.length);
      }
      return result;
    }
}

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

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

相关文章

携程租车宝滑块和token 1002

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi a…

6款文案生成器,自动生成文案告别创作烦恼

大家都知道&#xff0c;优质的文案都能为品牌和个人带来巨大的价值。但是对于许多人来说&#xff0c;要创作出优质的文案并非易事&#xff0c;有的人会因为创作灵感枯竭&#xff0c;而出现创作文案的烦恼&#xff0c;有的人会因为创作的文案需要重复修改&#xff0c;而出现文案…

STM32串口工作原理

STM32的串口是相当丰富的&#xff0c;功能也很强劲。最多可提供5 路串口&#xff0c;有分数波特率发生器、支持单线光通信和半双工单线通讯、支持LIN、智能卡协议和IrDA SIRENDEC 规范(仅串口3支持)、具有DMA等。 串口最基本的设置&#xff0c;就是波特率的设置。STM32的串口使…

太速科技-3U VPX飞腾处理器刀片计算机

3U VPX飞腾处理器刀片计算机 一 、产品概述 该产品是一款基于国产飞腾FT2000 4核或腾锐D2000 8核的高性能3U VPX刀片式计算机。产品提供了4个x4 PCIe 3.0总线接口&#xff0c;同时可配置为1个x16或2个x8 PCIe3.0接口&#xff0c;因此具有很强的扩展性&#xff0c;极大…

pwn入门--格式化字符串

pwn入门–格式化字符串 确定偏移&#xff1a; 32位&#xff1a; gdb中格式化字符串在栈上的位置的&#xff0c;左边序号值 就是偏移。 先到printf函数的调用位置&#xff1a; 观查栈上的数据&#xff1a; 64位&#xff1a; gdb中格式化字符串在栈上的位置的&#xff0c…

AI虚拟医生重塑医患关系

如今&#xff0c;越来越多的企业开始选择用AI虚拟数字人播报员替代真人出镜&#xff0c;这不仅有助于企业实现降本增效的目标&#xff0c;更能让广告传播趋向多样化和个性化。对于普通人而言&#xff0c;也摆脱了真人出镜的种种烦恼&#xff0c;让表达更加自由与便捷。AI虚拟数…

Bytebase 2.21.0 - 不同数据库引擎可配置不同 SQL 审核规则

&#x1f680; 新功能 支持不同数据库引擎配置不同 SQL 审核规则。 支持为工单事件配置企业微信私聊通知。 支持连接到 Redis 哨兵架构和原生集群。 在项目级别&#xff0c;支持设置&#xff1a; 是否允许在工单创建后修改 SQL 语句。是否自动完成已发布的工单。 &#x1f51…

ensp防火墙实验

实验拓扑图 实验要求 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问。 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3&#xff0c;办公区设备10.0.2.10不允…

CSS选择器:基本选择器、复合选择器、伪类选择器、伪元素选择器

CSS选择器包含&#xff1a;基本选择器、复合选择器、伪类选择器、伪元素选择器。 选择器是选择标签的一种方式&#xff0c;例如 ID 选择器就是通过 ID 选择标签的&#xff0c;类选择器就是通过类名选择标签的。 在 CSS3 中有很多类型的选择器&#xff0c;如下是《W3school》提…

(8)揭示Python编程精髓:深潜继承与多态的奇幻之旅

目录 1. 命名空间与作用域1.1 命名空间概述1.2 作用域1.2.1 局部作用域1.2.2 全局作用域1.2.3 修改全局变量1.2.4 嵌套作用域 2. 继承3. 多态&#xff08;Polymorphism&#xff09; 1. 命名空间与作用域 1.1 命名空间概述 命名空间是一个从名字到对象的映射&#xff0c;它在P…

小程序多次扫描获取sence失败------ivx

扫码图片被告知侵权了&#xff0c;删除了&#xff0c;如果有需要的同学可以自己尝试。或者直接联系我。 在微信小程序里面有一个函数 wx.getEnterOptionsSync() 功能描述 获取本次小程序启动时的参数。如果当前是冷启动&#xff0c;则返回值与 App.onLaunch 的回调参数一致&am…

【C语言】C语言 学生成绩管理系统(源码+报告)【千行代码】【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

SpringCloud架构师面试

一、微服务是什么 1、基本概念 微服务是一种架构风格&#xff08;区别于单体架构、垂直架构、分布式架构、SOA架构&#xff09;&#xff0c;应用程序被划分为更小的、流程驱动的服务。 2、微服务的特征 轻量化&#xff1a;将复杂的系统或者服务进行纵向拆分&#xff0c;每个…

前端工程化(01):10款自动化构建工具初识。

前端工程化自动化构建工具是用于简化前端开发流程、提高开发效率和优化项目质量的工具。市面上的工具多种多样&#xff0c;贝格前端工场先介绍一下什么是前端工程化&#xff0c;为什么要前端工程化&#xff0c;以及常用工具&#xff0c;后面会对各种工具逐一介绍。 一、什么是…

【计算机组成原理 | 第三篇】各个硬件的组成部分

前言&#xff1a; 在前面的文章中&#xff0c;我们介绍了计算机架构的基本组成。可以知道计算机的基本架构由“存储器”&#xff0c;“运算器”&#xff0c;“控制器”&#xff0c;“输入设备”&#xff0c;“输出设备”这五部分组成。 在这片文章中&#xff0c;我们来深入的了…

文件编码、文件读取 (继续学习!)

1、文件编码 计算机中有许多可用编码&#xff1a; UTF-8&#xff08;通用编码&#xff09; GBK&#xff08;中文体系经常使用&#xff09; Big5&#xff08;繁体字经常使用&#xff09; 1&#xff09;编码的定义 即规则集合&#xff0c;记录了内容和二进制之间进行相互转…

java的遍历的方法对比 效率对比

在 Java 中&#xff0c;遍历对象的方式主要取决于对象的类型和数据结构。以下是几种常见的遍历方式&#xff0c;以及它们的效率比较&#xff1a; 普通的 for 循环&#xff1a; 效率&#xff1a;高。使用普通的 for 循环可以直接根据索引来访问元素&#xff0c;适用于数组和实现…

软件测试面试题及答案,2024最强版

导读 精选400道软件测试面试真题&#xff0c;高清打印版打包带走&#xff0c;横扫软件测试面试高频问题&#xff0c;涵盖测试理论、Linux、MySQL、Web测试、接口测试、APP测试、Python、Selenium、性能测试、LordRunner、计算机网络、数据结构与算法、逻辑思维、人力资源等模块…

Nginx配置基础

ect/nginx/nginx.conf配置 1&#xff09;nginx 相关目录 工作目录&#xff1a;ect/nginx 家目录 执行文件&#xff1a;/usr/sbin/nginx 启动或重载 sudo /usr/sbin/nginx -t 检查配置文件 sudo /usr/sbin/nginx -s reload 重启服务 日志文件&#xff1a;/var/log/nginx 启动文…

除2! (题目来源:牛客)

题目来源&#xff1a;牛客网 给一个数组&#xff0c;一共有n个数。 你能进行最多k次操作。每次操作可以进行以下步骤&#xff1a; 选择数组中的一个偶数 a&#xff0c;将其变成a/2。 现在你进行不超过 k 次操作后&#xff0c;让数组中所有数之和尽可能小。请输出这个最小的和。…