单调栈的理解

单调栈的理解

    • 核心代码
    • 场景
      • 思考
    • 完整代码
    • 环形数组
      • 循环数组

单调栈: 单调递增单调递减的栈

核心代码

while (!s.empty()&&s.peek()<=nums[i]){s.pop();
}
s.push(nums[i]);

将要放入的元素,与栈内元素依个比较,小于的都出栈,最后将要放入的元素入栈,实现单调功能。

场景

Next Greater Number 问题:给你⼀个数组,返回⼀个等长的数组,对应索引存储着下⼀个更⼤元素,如果没有更⼤的元素,就存-1。
例如:数组 [2,1,2,4,3],返回数组 [4,2,4,-1,-1]。

思考

可以看作每个元素向后看,看到的第一个大于其自身的元素,即为所求。(这个过程便是核心代码过程,小于其自身的均出栈,直到看到大于其自身的元素。)
采用从后向前方式遍历原始数组(因为是向后看,后面的元素先入栈出栈,前面的元素再入栈。)
在这里插入图片描述

完整代码

static void nextGreater(int[] nums){int[] ans = new int[nums.length];Stack<Integer> s = new Stack<>();for(int i = nums.length-1;i>=0;i--){while (!s.empty()&&s.peek()<=nums[i]){s.pop();}ans[i] = s.empty()?0:s.peek()-i;s.push(nums[i]);}for (int i : ans) {System.out.printf("%d ",i);}}

环形数组

同样是 Next Greater Number,现在假设数组是个环形的,如何处理?
在这里插入图片描述

循环数组

可通过 % 取模符号实现环形效果。
例如

int[] arr = {1,2,3,4,5};
int n = arr.length, index = 0;
while (true) {print(arr[index % n]);index++;
}

本场景中,可看作原始数组的两倍数组,从而实现不仅向后看,也向前看(即将向前看,通过把前面的数字放到后面达到向前看的效果)
在这里插入图片描述
但是可以不用构造双倍数组,而是利用循环数组的技巧进行模拟。(for循环可以按照两倍数组来向一下,只不过去看具体值的时候使用nums[i%size],即循环数组方式来看)

static int[] nextGreater(int[] nums){int size = nums.length;int[] ans = new int[size];Stack<Integer> s = new Stack<>();for (int i = 2*size-1; i>=0; i--){while (!s.empty() && s.peek()<=nums[i % size]){s.pop();}ans[i % size] = s.empty()?-1:s.peek();s.push(nums[i % size]);}return ans;}```

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

即时设计-高效易用的界面工具

界面工具是设计师的得力助手&#xff0c;为设计师快速创建精美易用的用户界面提供了丰富的功能和直观的界面。在众多的界面工具中&#xff0c;有的支持预设模板、图标库和样式库&#xff0c;有的更注重原型和互动。如何选择优秀的界面工具&#xff1f;这里有一个高效易用的界面…

Latte:一个类似Sora的开源视频生成项目

前段时间OpenAI发布的Sora引起了巨大的轰动&#xff0c;最长可达1分钟的高清连贯视频生成能力秒杀了一众视频生成玩家。因为Sora没有公开发布&#xff0c;网上对Sora的解读翻来覆去就那么多&#xff0c;我也不想像复读机一样再重复一遍了。 本文给大家介绍一个类似Sora的视频生…

JAVA简单案例之ATM系统

注意&#xff1a;代码中的package univerisity.shanxi.atm;这一行是我自己新建的包名&#xff0c;每个人建的包名不一样的话这个也是不一样的&#xff0c;在自己新建的包下新建三个类Account、ATM、Test&#xff0c;然后将除了package univerisity.shanxi.atm;这一行以下的代码…

三、Distributed DataParallel分布式数据并行原理与应用

帮up宣传一下&#xff0c;优质up值得信赖&#xff01; B站UP&#xff1a;你可是处女座啊 文章目录 原理一、 DDP二、基本概念三、分布式训练中的通信 实战初始化进程组当前 进程 到底使用哪些数据&#xff1f;模型处理启动改造 loss 打印改造准确率改造数据划分训练前数据打乱…

EmoLLM(心理健康大模型)——探索心灵的深海,用智能的语言照亮情感的迷雾。

文章目录 介绍&#xff1a;应用地址&#xff1a;模型地址&#xff1a;Github地址&#xff1a;视频介绍&#xff1a;效果图&#xff1a; 介绍&#xff1a; EmoLLM是一个基于 InternLM 等模型微调的心理健康大模型&#xff0c;它涵盖了认知、情感、行为、社会环境、生理健康、心…

揭秘货运之心:可视化技术重塑火车站未来

货运火车站作为物流的重要枢纽&#xff0c;每天都在处理着海量的货物和运输任务。然而&#xff0c;对于大多数人来说&#xff0c;货运火车站依旧是一个神秘而复杂的世界。今天让我们通过可视化技术&#xff0c;一起走进货运火车站&#xff0c;感受其中的魅力与奥秘。 一、数据的…

常用的17个运维监控系统(必备知识)

1. Zabbix Zabbix 作为企业级的网络监控工具&#xff0c;通过从服务器&#xff0c;虚拟机和网络设备收集的数据提供实时监控&#xff0c;自动发现&#xff0c;映射和可扩展等功能。 Zabbix的企业级监控软件为用户提供内置的Java应用服务器监控&#xff0c;硬件监控&#xff0c…

WebGIS开发0基础必看教程:地图瓦片在Canvas上的拼接显示

1.前言 在之前的五个章节中&#xff0c;我们在第一章节里介绍了WebGIS的基本框架和技术&#xff0c;第二章节里介绍了什么是瓦片行列号以及计算它的原因&#xff0c;第三章节里介绍了如何通过地理范围计算出这个范围内瓦片的行列号&#xff0c;第四和第五章节里介绍了在得到瓦…

LeetCode:1976. 到达目的地的方案数(spfa + 记忆化 Java)

目录 1976. 到达目的地的方案数 原题链接 题目描述&#xff1a; 实现代码与解析&#xff1a; spfa 记忆化 原理思路&#xff1a; 1976. 到达目的地的方案数 原题链接 1976. 到达目的地的方案数 题目描述&#xff1a; 你在一个城市里&#xff0c;城市由 n 个路口组成&a…

04. Nginx入门-Nginx WEB模块

测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径&#xff1a;/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…

图书推荐|Word文稿之美

让你的文档从平凡到出众&#xff01; 本书内容 《Word文稿之美》是一本全面介绍Word排版技巧和应用的实用指南。从初步认识数字排版到高效利用模板、图文配置和表格与图表的排版技巧&#xff0c;再到快速修正错误和保护文件&#xff0c;全面系统地讲解数字排版的技术和能力&…

使用git的小笔记

平时工作中使用git存储项目代码&#xff0c; 常用的命令 拉取仓库代码 git clone http://100.100.100.100:9080/my_test/test.git 拉取到以后&#xff0c; 先切换到自己的分支 git checkout my_name 一顿魔改代码 然后 add 新增的文件或者修改的文件 git add * 然后提交 并写…