代码随想录算法训练营第五十天| 739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II

news2024/11/10 7:05:29

739. 每日温度

在这里插入图片描述

题目链接: 739. 每日温度
文档讲解:代码随想录
状态:不会

思路:
这道题需要找到下一个更大元素。
使用栈来存储未找到更高温度的下标,那么栈中的下标对应的温度从栈底到栈顶是递减的。这意味着,栈顶元素的温度是当前温度数组中未找到更高温度的最高温度的下标。

总结成一句话就是:在解决“下一个更大元素”问题时,遍历数组时,如果当前元素大于栈顶元素,就先将栈顶元素出栈并更新其结果,然后将当前元素入栈。

题解:

    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] res = new int[n];  // 初始化结果数组,长度与温度数组相同
        Deque<Integer> stack = new LinkedList<>();  // 初始化栈,用于存储未找到更高温度的下标

        for (int i = 0; i < n; i++) {  // 遍历温度数组
            // 如果当前温度高于栈顶元素的温度,则更新结果数组
            // 使用栈来存储未找到更高温度的下标,栈中的下标对应的温度从栈底到栈顶是递减的。
            // 这意味着,栈顶元素的温度是当前温度数组中未找到更高温度的最高温度的下标。
            while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peekLast()]) {
                int index = stack.pollLast();  // 弹出栈顶元素
                res[index] = i - index;  // 计算当前下标与栈顶元素下标的差值,并更新结果数组
            }
            stack.addLast(i);  // 将当前下标添加到栈中
        }

        return res;  // 返回结果数组
    }

496.下一个更大元素 I

在这里插入图片描述

题目链接: 496.下一个更大元素 I
文档讲解:代码随想录
状态:用的另一种方法

单调栈思路:

这题是属于找下一个更大元素,所以可以使用单调栈。

和每日温度类似,可以对nums2使用单调栈,即当前元素大于栈顶元素,就先将栈顶元素出栈并更新其结果,然后将当前元素入栈。但是这道题需要从nums2中找nums1元素,并且res的更新是按照nums1来的,所以可以将nums1中的元素存入哈希表中,如果nums2中遍历到的元素是nums1中的元素,则额外更新res。

题解:

    // 方法1: 暴力+哈希解法
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int[] res = new int[nums1.length];  // 结果数组
        HashMap<Integer, Integer> map = new HashMap<>();  // 存储 nums2 中元素的下标
        for (int i = 0; i < nums2.length; i++) {
            map.put(nums2[i], i);  // 将 nums2 中的元素及其下标放入 map 中
        }
        for (int i = 0; i < nums1.length; i++) {
            Integer index = map.get(nums1[i]);  // 获取 nums1 中元素在 nums2 中的下标
            for (int j = index; j < nums2.length; j++) {
                if (nums2[j] > nums1[i]) {  // 找到第一个比 nums1[i] 大的元素
                    res[i] = nums2[j];  // 更新结果数组
                    break;
                } else {
                    res[i] = -1;  // 未找到更大元素,默认设置为 -1
                }
            }
        }
        return res;
    }

    // 方法2: 单调栈
    public int[] nextGreaterElement2(int[] nums1, int[] nums2) {
        int[] res = new int[nums1.length];  // 结果数组
        Arrays.fill(res, -1);  // 初始化结果数组为 -1
        HashMap<Integer, Integer> map = new HashMap<>();  // 存储 nums1 中元素的下标
        Deque<Integer> stack = new LinkedList<>();  // 初始化单调栈
        for (int i = 0; i < nums1.length; i++) {
            map.put(nums1[i], i);  // 将 nums1 中的元素及其下标放入 map 中
        }
        for (int i = 0; i < nums2.length; i++) {
            // 如果当前元素 nums2[i] 大于栈顶元素,则更新栈顶元素在结果数组中的值
            while (!stack.isEmpty() && nums2[stack.peekLast()] < nums2[i]) {
                Integer num = nums2[stack.pollLast()];  // 弹出栈顶元素
                if (map.containsKey(num)) {
                    res[map.get(num)] = nums2[i];  // 更新结果数组中对应位置的值
                }
            }
            stack.addLast(i);  // 将当前元素下标加入栈中
        }
        return res;
    }

503.下一个更大元素II

在这里插入图片描述

题目链接: 503.下一个更大元素II
文档讲解:代码随想录
状态:磕磕绊绊

思路:
最直接的想法把两个数组拼接在一起,然后使用单调栈求下一个最大值。
优化的话在遍历的过程中模拟走了两边nums。

题解:

   public int[] nextGreaterElements(int[] nums) {
        int n = nums.length; // 获取数组的长度
        int[] res = new int[n]; // 结果数组,用来存储每个元素的下一个更大元素
        Arrays.fill(res, -1); // 初始化结果数组,默认值为-1
        Deque<Integer> stack = new LinkedList<>(); // 单调栈,用来存储数组元素的下标

        // 遍历2倍长度的数组,模拟循环数组
        for (int i = 0; i < 2 * n; i++) {
            // 如果当前元素大于栈顶元素,则更新栈顶元素在结果数组中的值
            while (!stack.isEmpty() && nums[i % n] > nums[stack.peekLast()]) {
                res[stack.pollLast()] = nums[i % n]; // 更新结果数组中对应下标的值
            }
            // 只将前n个元素的下标入栈
            if (i < n) {
                stack.addLast(i); // 将当前下标入栈
            }
        }
        return res; // 返回结果数组
    }

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

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

相关文章

鸿蒙语言基础类库:【@ohos.application.testRunner (TestRunner)】 测试

TestRunner TestRunner模块提供了框架测试的能力。包括准备单元测试环境、运行测试用例。 如果您想实现自己的单元测试框架&#xff0c;您必须继承这个类并覆盖它的所有方法。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-…

5款常用的漏洞扫描工具,网安人员不能错过!

漏洞扫描是指基于漏洞数据库&#xff0c;通过扫描等手段对指定的远程或者本地计算机系统的安全脆弱性进行检测&#xff0c;发现可利用漏洞的一种安全检测的行为。 在漏洞扫描过程中&#xff0c;我们经常会借助一些漏扫工具&#xff0c;市面上漏扫工具众多&#xff0c;其中有一…

windows环境下基于3DSlicer 源代码编译搭建工程开发环境详细操作过程和中间关键错误解决方法说明

说明: 该文档适用于  首次/重新 搭建3D-Slicer工程环境  Clean up(非增量) 编译生成 1. 3D-slicer 软件介绍 (1)3D Slicer为处理MRI\CT等图像数据软件,可以实行基于MRI图像数据的目标分割、标记测量、坐标变换及三维重建等功能,其源于3D slicer 4.13.0-2022-01-19开…

新火种AI|微软和苹果放弃OpenAI董事会观察员席位

作者&#xff1a;一号 编辑&#xff1a;美美 微软苹果双双不做OpenAI“观察员”&#xff0c;OpenAI能更自由吗&#xff1f; 7月10消息&#xff0c;微软当地时间周一宣布将放弃在OpenAI董事会的观察员席位&#xff0c;他们称&#xff0c;OpenAI在过去八个月中取得了“重大进展…

Java(十八)---单链表

文章目录 前言1.链表的概念及结构2.单链表的创建3.功能的实现3.1.创建链表(create)(需要自己创建)3.2.显示链表(display)3.3.获取链表的个数( size() )3.4.是否包含指定元素(contains)3.5.头插法(addFirst)3.6.尾插法(addLast)3.7.在指定位置进行插入(addIndex)3.8.删除出现在第…

基于Spring Boot的高校后勤餐饮管理系统

1 项目介绍 1.1 研究背景 “互联网”时代的到来&#xff0c;既给高校后勤管理发展带来了机遇&#xff0c;也带来了更大的挑战。信息化应用已经开始普及&#xff0c;传统的高校后勤餐饮管理模式往往存在着效率低下、信息不透明、资源浪费等问题&#xff0c;已经难以满足现代高…

CSS 【实用教程】(2024最新版)

CSS 简介 CSS 是层叠样式表( Cascading Style Sheets ) 的简写&#xff0c;用于精确控制 HTML 页面的样式&#xff0c;以便更好地展示图文信息或产生炫酷/友好的交互体验。 没有必要让所有浏览器都显示得一模一样的&#xff0c;好的浏览器有更好的显示&#xff0c;糟糕的浏览器…

Linux编程第三篇:Linux简介,开源软件简介(Linux是否安全?参考TESEC指标)

业精于勤荒于嬉&#xff0c;行成于思毁于随。 今天这篇算是Linux的正式学习&#xff0c;废话不多说&#xff0c;我们开始吧 第三篇 一、UNIX与Linux发展史1.1、UNIX发展历史和发行版本1.2、UNIX主要发行版本1.3、Linux发展历史1.4、Linux内核版本1.5、Linux主要发行版本 二、开…

多周期路径的约束与设置原则

本节将回顾工具检查建立保持时间的原则&#xff0c;接下来介绍设置多周期后的检查原则。多周期命令是设计约束中常用的一个命令&#xff0c;用来修改默认的建立or保持时间的关系。基本语法如下 默认的建立时间与保持时间的检查方式 DC工具计算默认的建立保持时间关系是基于时钟…

前台线程和后台线程(了解篇)

在多线程编程中&#xff0c;理解线程的不同类型对于编写高效、稳定的程序至关重要。特别地&#xff0c;前台线程&#xff08;Foreground Threads&#xff09;与后台线程&#xff08;Background Threads&#xff09;在行为上有着根本的区别&#xff0c;这些区别直接影响到程序的…

8、matlab彩色图和灰度图的二值化算法汇总

1、彩色图和灰度图的二值化算法汇总原理及流程 彩色图和灰度图的二值化算法的原理都是将图像中的像素值转化为二值&#xff08;0或1&#xff09;&#xff0c;以便对图像进行简化或者特定的图像处理操作。下面分别介绍彩色图和灰度图的二值化算法的原理及流程&#xff1a; 1&a…

【java实现结果集转为树结构,树转为扁平结构】

list转为树&#xff0c;树拉平 业务需求oracle实现树结构1、**Controller.java层** &#xff1a;前端调此处请求2、**service层&#xff1a;** 逻辑结构 &#xff08;zbjcpjService.java&#xff09;&#xff0c;重点&#xff1a;this.entityMapper.queryZbjcpjTree接口3、**ma…

opc ua设备数据 转MQTT项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置VFBOX网关采集OPC UA的数据 2 5 用MQTT协议转发数据 4 6 配置参数说明 4 7 上报内容配置 5 8 其他说明 8 9 案例总结 8 1 案例说明 设置网关采集OPC UA设备数据把采集的数据转成MQTT协议转发给其他系统。 2 VFB…

【备战秋招】——算法题目训练和总结day3

【备战秋招】——算法题目训练和总结day3&#x1f60e; 前言&#x1f64c;BC149简写单词题解思路分析代码分享&#xff1a; dd爱框框题解思路分析代码分享&#xff1a; 除2&#xff01;题解思路分析代码分享&#xff1a; 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff…

Chromium源码阅读(7):了解WTF的静态字符串机制

在浏览器的实现中&#xff0c;处理HTML和CSS涉及大量的字符串操作&#xff0c;这些操作通常包括字符串的比较、查找和匹配。如果使用普通的字符串对这些进行操作&#xff0c;在面临大量DOM元素和CSS规则时会导致效率低下。 例如&#xff0c;当解析CSS时&#xff0c;属性名如col…

05_TypeScript 中的数据类型

TypeScript 中的数据类型 一、概述二、详解布尔类型&#xff08;boolean&#xff09; true / false数字类型&#xff08;number&#xff09;字符串类型&#xff08;string&#xff09;数组类型&#xff08;array&#xff09;元组类型&#xff08;tuple&#xff09; 属于数组的一…

【Qt 初识 Test】用图形化和代码的方式实现简单的Qt程序

文章目录 1. 通过图形化的方式实现&#x1f34e;2. 通过代码的方式实现 1. 通过图形化的方式实现&#x1f34e; 在界面创建出一个控件&#xff0c;显示 hello world&#xff0c;通过拖拽的方式实现&#xff1b; widget.ui文件如下&#xff1a;&#x1f50d; 生成的 ui_widget.…

【Java16】多态

向上类型转换 对于引用变量&#xff0c;在程序中有两种形态&#xff1a;一种是编译时类型&#xff0c;这种引用变量的类型在声明它的时候就决定了&#xff1b;另一种则是运行时类型&#xff0c;这种变量的类型由实际赋给它的对象决定。 当一个引用变量的编译时类型和运行时类…

mybatis日志记录方案

首先对指定表进行监控 对表进行监控,那么就要使用的是statementInterceptor 拦截器 使用拦截器那么就要写intercepts写拦截条件进行拦截 监控只对与增删改 查询不进行监控 对于字段的监控,是谁修改了字段,那么就进行报警,或者提醒 消息提醒使用钉钉机器人进行消息提醒 P…

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理 目录 AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理 一、简单介绍 二、文本摘要 三、在CNN/Daily…