数组题目总结 -- 单调栈问题

news2024/11/27 14:26:28

目录

  • 零. 单调栈
  • 一. Next Greater Element(单调栈问题模板)
    • 题目简述:
    • 思路和代码:
      • I. 思路
      • II. 代码
  • 二. Next Warmer Weather
    • 题目简述:
    • 思路和代码:
      • I. 思路
      • II. 代码
  • 三. Next Greater Elements(循环数组)
    • 题目简述:
    • 思路和代码:
      • I. 思路
      • II. 代码
  • 四. 不同字符的最小子序列
    • 思路和代码:
      • I. 博主的做法
      • II. 东哥的做法
  • 五. 去除重复字母
    • 思路和代码:

零. 单调栈

  • 单调栈实际上就是栈,只是利用了一些巧妙的逻辑,使得每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减)。
  • 它不同于堆,只处理一种典型的问题,叫做 Next Greater Element。

一. Next Greater Element(单调栈问题模板)

题目简述:

给你一个数组,返回一个等长的数组,对应索引存储着下一个更大元素,如果没有更大的元素,就存 -1。

eg:给你一个数组 [2,1,2,4,3],你返回数组 [4,2,4,-1,-1]。

解释:第一个 2 后面比 2 大的数是 4;1 后面比 1 大的数是 2;第二个 2 后面比 2 大的数是 4; 4 后面没有比 4 大的数,填 -1;3 后面没有比 3 大的数,填 -1。

  • 函数名:public static int[] nextGreaterElement(int[] nums){ }

思路和代码:

I. 思路

  • 先看东哥举的例子,类似于站队的问题,每个人都向后看,看到 第一个比他高的 就输出。
    在这里插入图片描述

  • 从后面向前将给的数组入栈。

  • 如果后面没有人比他高,或者后面根本没有人,那么直接返回-1。(将后面比他低的人弹出栈,一个一个的向后面比,直到后面没有人)

  • 将这个人加入栈,作为前一个人的比较标准。重复上面的步骤。

II. 代码

public static int[] nextGreaterElement(int[] nums){
    int[] res = new int[nums.length];
    Stack<Integer> stack = new Stack<>();

    for(int i = nums.length-1; i >= 0; i--){
        while(!stack.isEmpty() && stack.peek() <= nums[i] ){
            stack.pop();
        }
        res[i] = stack.isEmpty() ? -1 : stack.peek();
        stack.push(nums[i]);
    }
    return res;
}

二. Next Warmer Weather

题目简述:

给你一个数组 T,这个数组存放的是近几天的天气气温。你返回一个数组,计算:对于每一天,你还要至少等多少天才能等到一个更暖和的气温;如果等不到那一天,填 0 。

eg:给你 T = [73, 74, 75, 71, 69, 72, 76, 73],你返回 [1, 1, 4, 2, 1, 1, 0, 0]。

解释:第一天 73 华氏度,第二天 74 华氏度,比 73 大,所以对于第一天,只要等一天就能等到一个更暖和的气温。后面的同理。

  • 函数名:public static int[] nextWarmerWeather(int[] weather){ }

思路和代码:

I. 思路

  • 和上道题很像,就是入栈的时候,入的是索引而不是数组值。

II. 代码

public static int[] nextWarmerWeather(int[] weather){
    int[] res = new int[weather.length];
    Stack<Integer> stack = new Stack<>();

    for(int i = weather.length-1; i >= 0; i--){
        while(!stack.isEmpty() && weather[stack.peek()] <= weather[i]){
               stack.pop();
        }
        res[i] = stack.isEmpty() ? 0 : stack.peek() - i;
        stack.push(i);
    }
    return res;
}

三. Next Greater Elements(循环数组)

题目简述:

同样是 Next Greater Number,现在假设给你的数组是个环形的

eg:给你一个数组 [2,1,2,4,3],你返回数组 [4,2,4,-1,4]。拥有了环形属性,最后一个元素 3 绕了一圈后找到了比自己大的元素 4

  • 函数名:

思路和代码:

I. 思路

  • 和第一道题很类似。既然是循环数组,最坏的情况就是,一个比它大的数就在它的最前面,也就是题目中例子给的这样,3 要再绕整个数组一圈才能找到 4。
  • 也就是说最多需要遍历两遍数组,而数据结构在内存中存储都是以线性的形式的,我们通过修改循环条件(一般是通过 % 运算符求模(余数))来改变数组的遍历次数。
  • 如果想要遍历 n 遍数组,那么把 2 改为遍历的次数就可以了。
    在这里插入图片描述

II. 代码

public static int[] nextGreaterElement_circle(int[] nums){
    int[] res = new int[nums.length];
    Stack<Integer> stack = new Stack<>();

    for(int i = 2 * nums.length-1; i >= 0; i--){
        while(!stack.isEmpty() && stack.peek() <= nums[i % nums.length] ){
            stack.pop();
        }
        res[i % nums.length] = stack.isEmpty() ? -1 : stack.peek();
        stack.push(nums[i % nums.length]);
    }
    return res;
}

四. 不同字符的最小子序列

  • 题目链接:https://leetcode.cn/problems/smallest-subsequence-of-distinct-characters/

思路和代码:

I. 博主的做法

  • 看都没看懂,什么叫返回结果的字典序最小。。。

II. 东哥的做法

  • 题目的要求:
    • 去重
    • 不能打乱原来的顺序
    • 保证字典序最小(类似单调栈问题)
class Solution {
    public String removeDuplicateLetters(String s) {
        Stack<Character> stack = new Stack<>();
        //a从97开始,足够塞下26个字母了
        int[] count = new int[150];

        for(int i = 0; i < s.length(); i++)
            count[s.charAt(i)]++;
        
        //用桶排序的方法统计每一个字母的个数
        char[] num = s.toCharArray();

        for(char c : num){
            count[c]--;
			//如果栈中有,就不加了,去除重复元素
            if(stack.contains(c))
                continue;
            //最大限度的处理排序问题,尽可能的使最后的顺序为字典序
            //eg:bcabc,前面的bc都会在这里弹出去
            while(!stack.empty() && stack.peek() > c){
                if(count[stack.peek()] == 0)
                    break;
                stack.pop();
            }

            stack.push(c);
        
        }
        StringBuilder stb = new StringBuilder();

        while(!stack.empty())
            stb.append(stack.pop());
            
        return stb.reverse().toString();
    }
}

五. 去除重复字母

  • 题目链接:https://leetcode.cn/problems/remove-duplicate-letters/

思路和代码:

  • 和上道题一模一样

参考:
https://labuladong.github.io/algo/di-yi-zhan-da78c/shou-ba-sh-48c1d/yi-dao-shu-ed782/

https://mp.weixin.qq.com/s__biz=MzAxODQxMDM0Mw==&mid=2247484525&idx=1&sn=3d2e63694607fec72455a52d9b15d4e5&chksm=9bd7fa65aca073734df90b45054448e09c14e6e35ad7b778bff62f9bd6c2b4f6e1ca7bc4f844&scene=21#wechat_redirect

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

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

相关文章

UG\NX二次开发 装配下的点坐标

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UF_CURVE_create_point 创建一个点 UF_CSYS_create_temp_csys 创建临时坐标系 以上两个函数都有一个点坐标输入,而且都是输入的绝对坐标系下的点坐标值。下面验证在装配下两个绝对坐标值具体指 “当…

【三维视觉】空间点集的最小包围盒计算

0 问题描述 假设有一个空间点集&#xff0c;不重合的点数有N个。 N1时&#xff0c;最小包围盒是一个点&#xff1a;中心为其本身&#xff0c;半径无穷小 N2时&#xff0c;最小包围盒是一个圆&#xff1a;中心为连线中点&#xff0c;半径为边长一半 N3时&#xff0c;不共线的三…

【C#】并行编程实战:任务并行性(上)

在 .NET 的初始版本中&#xff0c;我们只能依赖线程&#xff08;线程可以直接创建或者使用 ThreadPool 类创建&#xff09;。ThreadPool 类提供了一个托管抽象层&#xff0c;但是开发人员仍然需要依靠 Thread 类来进行更好的控制。而 Thread 类维护困难&#xff0c;且不可托管&…

优惠券超发问题该怎么测试?

在拼夕夕面试中&#xff0c;面试官问了一连串经典的问题&#xff1a;“优惠券库存是怎么扣减的&#xff1f;开发为了解决超发优惠券问题而设计的方案&#xff0c;你了解过吗&#xff1f;你又是如何测试的呢&#xff1f;” 当时听到这些问题还挺懵的&#xff0c;没遇到过超发问…

MidJourney教程02

1.主体内容&#xff1a;高数AI你需要画什么&#xff1f;比如说&#xff0c;一个男生在电脑前画画&#xff1f; 2.环境北京&#xff1a;例如给某些地点或者物件&#xff0c;比如桌子上&#xff0c;足球场&#xff0c;水面有倒影等&#xff1f; 3.构图镜头&#xff1a;比如说强…

springboot项目外卖管理 day07-功能补充

文章目录 前端补充功能1、历史订单功能1.1、梳理过程1.2历史订单展示1.3、效果展示 2、修改/删除地址2.1、回显数据梳理过程 代码展示 2.2、修改地址梳理过程代码 2.3、删除地址梳理过程代码展示 3、再来一单功能3.1、梳理过程3.2、具体实现思路&#xff08;参考一下当初我们怎…

Linux操作系统——第四章 进程间通信

目录 进程间通信介绍 进程间通信目的 进程间通信发展 进程间通信分类 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 管道读写规则 管道特点 命名管道 创建一个命名管道 匿名管道与命名管道的区别 命名管道的打开规则 system V共享内存 共享内存示意…

【SpringBoot】解决依赖版本不一致报错问题

哈喽大家好&#xff0c;我是阿Q。今天在开发代码的过程中&#xff0c;由于手抖&#xff0c;不知道引入了什么包依赖&#xff0c;导致项目启动一直报错&#xff0c;特写本文来记录下解决问题的经过。 文章目录 问题描述报错信息如下报错描述 解决方法总结 问题描述 报错信息如下…

vite中使用 vite- aliases 插件报错

vite 中使用 vite-aliases 插件报错 vite-aliases 介绍报错内容解决方法 vite-aliases 介绍 vite-aliases 可以帮助我们自动生成别名: 检测你当前目录下包括 src 在内的所有文件夹, 并帮助我们去生成别名。 下载 npm i vite-aliases -D 使用 import { defineConfig } from vi…

VALSE 2023 无锡线下参会个人总结 6月11日-2

VALSE2023无锡线下参会个人总结 6月11日-2 6月11日会议日程安排Workshop&#xff1a;目标检测与分割程明明&#xff1a;粒度自适应的图像感知技术张兆翔&#xff1a;基于多传感器融合的视觉物体检测与分割 Workshop&#xff1a;ChatGPT与计算机视觉白翔&#xff1a;再谈ChatGPT…

290. 单词规律

290. 单词规律 C代码&#xff1a;别人手搓的 bool wordPattern(char * pattern, char * s){char arr[301][3001];char *p strtok(s, " ");int pos 0;while(p ! NULL) {sprintf(arr[pos], "%s", p);p strtok(NULL, " ");}int len strlen(pat…

Linux环境安装Jdk图文步骤

准备工作&#xff1a; a、jdk安装包&#xff1a;百度网盘 请输入提取码&#xff0c;提取码&#xff1a;jdk8 b、远程工具&#xff0c;xshell&#xff0c;&#xff0c;electerm&#xff0c;&#xff0c;MobaXterm&#xff0c;&#xff0c;fxp&#xff0c;docker&#xff0c;宝…

软件测试V、W和H模型的优缺点汇总,零基础必看哦

目录 V模型 W模型 H模型 总结&#xff1a; 软件测试有三种模型&#xff0c;分别是V模型&#xff0c;W模型和H模型。每种模型都有自己的优点和缺点。 V模型 V模型如下图所示&#xff1a; V模型的优点 V模型明确地标识出了在开发过程中一般应完成的测试级别&#xff0c;以及…

STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号

STM32-HAL库串口DMA空闲中断的正确使用方式解析SBUS信号 一. 问题描述二. 方法一——使用HAL_UART_Receive_DMA三. 方法二——使用HAL_UARTEx_ReceiveToIdle_DMA四. 方法三——使用HAL_UARTEx_ReceiveToIdle_IT&#xff08;不使用DMA&#xff09;五. 总结 一. 问题描述 能够点…

java springboot整合MyBatis-Plus 多用点Plus支持一下国人开发的东西吧

文章java springboot整合MyBatis做数据库查询操作讲述了boot项目整合MyBatis的操作方法 但现在就还有一个 MyBatis-Plus Plus是国内整合的一个技术 国内的很多人会喜欢用 特别是一些中小型公司 他们用着会比较舒服 好 然后我们打开idea 创建一个项目 选择 Spring Initializr…

(九)CSharp-数组

一、矩形数组 1、访问数组元素 class Program{static void Main(string[] args){int[] intArr1 new int[15];intArr1[2] 10;int var1 intArr1[2];int[,] intArr2 new int[5, 10];intArr2[2, 3] 7;int var2 intArr2[2, 3];int[] myIntArray new int[4];for (int i 0; i…

Git 报错 Updates were rejected because the remote contains work that you do

目录 Git 报错 Updates were rejected because the remote contains work that you do 1、命令行出现这种情况 2、idea出现同样的报错&#xff0c;解决方式同上 Git 报错 Updates were rejected because the remote contains work that you do 这个报错实在是让我受不了了&…

Kendo UI for jQuery---03.组件___网格---05.编辑---01.概述

编辑概述 编辑是剑道 UI 网格的一项基本功能&#xff0c;它允许您操作其数据的呈现方式。 网格提供以下编辑模式&#xff1a; 批量编辑 内联编辑 弹出窗口编辑 自定义编辑开始 要启用编辑&#xff1a; 熟悉剑道UI中的常见编辑概念 配置网格的数据源 通过配置定义字段schem…

PaddleOCR Windows下配置环境并测试

目录 1.PaddleOCR 介绍 1.2 PaddleOCR支持模型介绍 2.环境配置 3.PaddleOCR源码 1.PaddleOCR 介绍 PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库&#xff0c;助力开发者训练出更好的模型&#xff0c;并应用落地。 支持多种OCR相关前沿算法&#xff0c;在此基础上打…

简单的一批的DockerFile构建(内附超详细docker学习笔记)

目录 介绍 DockerFile常用保留字指令 演示自定义构建java8版本centos docker专用学习笔记 超全 介绍 总结: 从应用软件的角度来看&#xff0c;Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段&#xff0c; * Dockerfile是软件的原材料 * Docker镜像是软件…