LeetCode 打卡day59--单调栈

news2024/9/22 19:46:37

一个人的朝圣 — LeetCode打卡第59-60天

  • 知识总结
  • Leetcode 739. 每日温度
    • 题目说明
    • 代码说明
  • Leetcode 496. 下一个更大元素 I
    • 题目说明
    • 代码说明
  • Leetcode 84. 柱状图中最大的矩形
    • 题目说明
    • 代码说明


知识总结

今天做了单调栈的三道题
总结了一个模版套路:

  1. 寻找下一个更大的数
for(int i = 0; i < len; i++){
	while(!stack.isEmpty() && nums[i] > nums[stack.peek()]{
		ans[nums.pop()] = nums[i];
	}
	stack.push(i);
}


Leetcode 739. 每日温度

题目链接

题目说明

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

在这里插入图片描述

代码说明

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        //单调栈, 存放的数据如果比栈顶元素小, 直接存
        //如果比栈顶元素大,将小的元素弹出来, 并且记录下结果
        int[] res = new int[temperatures.length];
        Deque<Integer> stack = new LinkedList<>();
        stack.push(0);
        for(int i = 1; i < temperatures.length; i++){
            while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]){
                int index = stack.pop();
                res[index] = i - index;
            }
            stack.push(i);
        }
        return res;
    }
}

Leetcode 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] 是如上所述的 下一个更大元素 。
在这里插入图片描述

代码说明

这道题和上面的区别在于, 我们需要一个额外的Map 来储存value: index

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int len1 = nums1.length, len2 = nums2.length;
        int[] res = new int[len1];
        Arrays.fill(res, -1);
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < len1; i++){
            map.put(nums1[i], i);
        }

        LinkedList<Integer> stack = new LinkedList<>();
        stack.push(0);
        for(int i = 0; i < len2; i++){
            while(!stack.isEmpty() && nums2[i] > nums2[stack.peek()]){
                int index = stack.pop();
                if(map.containsKey(nums2[index])){
                    res[map.get(nums2[index])] = nums2[i];
                }
            }
            stack.push(i);
        }
        return res;
    }
}

Leetcode 84. 柱状图中最大的矩形

题目链接

题目说明

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

在这里插入图片描述

代码说明

以前做过, 觉得很难, 现在明白了这个套路之后发现很简单.
我们需要两个数组, left, right.
left数组记录以当前高度的左边界, 也就是第一个小于当前高度柱子的index, 默认为-1
同理, right数组记录第一个小于当前数组柱子高度的index. 如果没有则为len

在这个例子中
如果heights = [2, 1, 5, 6, ,2 ,3]
left = [-1, -1, 1, 2, 1, 4]
right = [1, 6, 4, 4, 6, 6]

Area[i] = heights[i] * (right[i] - left[i] - 1)

class Solution {
    public int largestRectangleArea(int[] heights) {
        LinkedList<Integer> stack = new LinkedList<>();
        int len = heights.length;
        int[] left = new int[len];
        int[] right = new int[len];
        // 从左到右, 找到下一个比自己更小的
        Arrays.fill(right, len);
        for(int i = 0; i < len; i++){
            while(!stack.isEmpty() && heights[i] < heights[stack.peek()]){
                int index = stack.pop();
                right[index] = i;
            }
            stack.push(i);
        }
        // System.out.println(Arrays.toString(right));

        stack.clear();
        //从右向左遍历, 找到下一个比自己小的
        Arrays.fill(left, -1);
        for(int i =  len -1; i>=0;  i--){
            while(!stack.isEmpty() && heights[i] < heights[stack.peek()]){
                int index = stack.pop();
                left[index] = i;
            }
            stack.push(i);
        }
        // System.out.println(Arrays.toString(left));

        int res = 0;
        for(int i = 0; i < len; i++){
            res = Math.max(heights[i] * (right[i] - left[i] - 1), res);
        }
        return res;
    }
}

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

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

相关文章

Spring IOC - Bean的扫描

Component及其衍生注解&#xff1a;Configuration、Controller、Service、Repository标记的类&#xff0c;被Spring IOC扫描到后&#xff0c;即可被容器管理起来。其原理基本涵盖在AnnotationConfigApplicationContext构造函数体的三行代码里。 public AnnotationConfigApplic…

学校一键式报警器如何使用

学校一键式报警器通常是在紧急情况下使用的&#xff0c;例如火灾、恶性事件等。以下是一般的使用方法&#xff1a;1. 紧急情况发生时&#xff0c;发现危险或有人身安全受到威胁&#xff0c;迅速找到一键式报警器。2. 按下报警器上的按钮&#xff0c;通常是一个明显的红色按钮。…

查看docker运行状态,与查看防火墙运行状态

安装docker这里不细述了&#xff0c;可以通过 docker -version 查看安装的版本&#xff0c;出现成功就表示安装是ok的 查看docker状态是否启动状态&#xff0c;出现running就表示成功 systemctl status docker 如果没有则需要输入启动命令来启动 systemctl start docker 没报错…

前端学习——Web API (Day2)

Dom事件基础 事件监听 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"width…

干货 | 联通政企数据运营体系建设

以下内容整理自大数据能力提升项目必修课《大数据系统基础》同学们的期末答辩汇报。 我们将从以下几个方面为大家介绍我们的项目&#xff0c;首先第一部分是需求分析&#xff0c;然后是数据提取及处理&#xff0c;接着样本定义与分布、特征粗筛与模型选择、特征精筛与评分卡建模…

Java性能权威指南-总结28

Java性能权威指南-总结28 数据库性能的最佳实践Lambda表达式和匿名类Lambda表达式与匿名类加载 数据库性能的最佳实践 Lambda表达式和匿名类 对很多开发者而言&#xff0c;Java 8最激动人心的特性就是加入了Lambda表达式。不可否认&#xff0c;Lambda对Java开发者的开发效率有…

mac电脑 flv转mp4怎么转

mac电脑 flv转mp4怎么转&#xff1f;相信大家平时在电脑上下载视频的时候遇到过这样一个尴尬的事情&#xff0c;下载下来的视频不能被直接打开播放&#xff0c;而是需要使用专门的播放器才能打开查看&#xff0c;例如flv就是这样一种视频格式。大家都知道视频文件的格式种类非常…

CoT及ReAct解密与实战(三)

第8章 CoT及ReAct解密与实战 8.5 ReAct及计划和执行案例实战 我们来看一下LangChain的官方文档,首先它很简单的说了一下,计划和执行代理(Plan and execute agents)首先计划要做什么,然后执行子任务来实现目标,言外之意ReAct不是这样的,我们在ReAct中看见的内容是,有一步…

Debian使用Tomcat实现国密访问

环境准备&#xff1a; Debian 10 java version "1.8.0_131 Apache Tomcat/9.0.76 360国密浏览器 一.下载并安装jdk8 1.访问网站下载jdk8 https://www.oracle.com/java/technologies/downloads/#java8 2.解压到相应目录 3.配置环境变量 vim ~/.bashrc# java export JAV…

云端地球在建筑设计行业的应用

背景概述 建筑设计行业一直处于技术革新的前沿。随着数字化、信息化、智能化等技术的不断发展&#xff0c;建筑设计也将呈现出新的发展趋势。比如&#xff0c;计算机辅助设计、虚拟现实技术等将成为建筑设计的重要工具。此外&#xff0c;人工智能、大数据、物联网等新技术的应…

leetcode刷题——复制带随机指针的链表

思维导图&#xff1a; 题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点…

WPS Office AI实战:AI带来的文档智能化体验

前面我们已经了解过 AI 在PPT制作、Word写作方面带来的革命性效率提供&#xff0c;今天一起来聊聊在线文档的AI应用。如果你习惯用在线文档的话&#xff0c;一样也可以享受到AI的强大优势。金山在线智能云文档已经接入WPS Office AI套件大家庭&#xff0c;用AI来改造写作的新时…

QT day3作业

有点不对&#xff0c;不能运行了&#xff0c;怪事 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//字体 void Widget::on…

认识MQTT(C语言)

MQTT基础概念 MQTT 入门介绍 | 菜鸟教程 MQTT使用 在linux下搭建MQTT服务器&#xff08;Broker&#xff09; 在linux下执行下面命令安装MQTT服务器 &#x1f4ce;mosquitto-1.6.3.tar.gzhttps://www.yuque.com/attachments/yuque/0/2023/gz/35243076/1687955850547-b594126…

003-Dubbo服务的发布和引用

目录 Dubbo3.0发布注册应用级注册-配置应用级注册-端口应用级注册-消费者-确定服务信息应用级注册-消费者-元数据中心 Dubbo3.0 发布注册 应用级注册-配置 因为接口级注册随着服务增多&#xff0c;注册中压力会越来越大 所以在3.0版本提供了应用级注册 #默认是all 接口和应…

两两交换链表中的节点——力扣24

题目描述 方法一&#xff1a;递归 class Solution{ public:ListNode* swapPairs(ListNode* head){if(!head || !head->next){return head;} ListNode* newHead head->next;head->next swapPairs(newHead->next);newHead->next head;return newHead;} }; 方法…

python以固定时间间隔取行

目录 1. 间隔取行2. 时间戳间隔取行&#xff1a;下采样参考链接 1. 间隔取行 dataframe 实现每隔 n 行取 1 行 近期在做数据分析的时候&#xff0c;用到了对csv文件每隔n行取1行的操作&#xff0c;正常情况下会立马想到for循环&#xff0c;可能大家还会有其他方法&#xff0c…

第八章——函数探幽

C内联函数 内联函数是为了提高程序运行速度所做的一项改进。常规函数与内联函数的主要区别不在于编写方式&#xff0c;而在于C编译器如何将它们组合到程序中。 对于 C内联函数&#xff0c;编译器将使用相应的函数代码替换函数调用&#xff0c;程序无需跳到另一个位置处执行代…

LEADTOOLS V22 支持.NET 5-7.0 Crack

使用 LEADTOOLS 构建更好的应用程序 LEADTOOLS 由专利人工智能和机器学习算法提供支持&#xff0c;是一系列综合工具包&#xff0c;可将识别、文档、医疗、成像和多媒体技术集成到桌面、服务器、平板电脑、网络和移动解决方案中。 光学字符识别/ICR 以无与伦比的速度和准确性提…

Django系列所有漏洞复现vulhubCVE-2018-14574,CVE-2022-34265,CVE-2021-35042

文章目录 Django < 2.0.8 任意URL跳转漏洞&#xff08;CVE-2018-14574&#xff09;漏洞详情&#xff1a;复现&#xff1a; Django Trunc(kind) and Extract(lookup_name) SQL注入漏洞&#xff08;CVE-2022-34265&#xff09;漏洞详情&#xff1a;复现&#xff1a; Django Qu…