leetcode刷题(5)

2023-11-12

各位朋友们,大家好,今天是我leedcode刷题的第五篇,我们一起来看看吧。

栈的压入,弹出序列

leetcode之栈的压入与弹出序列(难度:中等)

题目要求

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

用例输入

示例 1:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

示例 2:
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。

提示

0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed 是 popped 的排列。

做题思路

我们来分别遍历这两个数组,遍历的同时先将pushed数组压入栈中,然后我们判断栈顶的数据是否跟popped数组的数据相等,如果相等就出栈,popped数组的下标+1,不相等我们就继续将pushed数组中的数据压入栈中,循环中这个数组,最后如果栈中为空则说明popped序列是pushed数组的弹出序列,不为空则不是。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
此时栈顶的数据等于popped[j],所以我们弹出栈顶的数据,并且将j++;
在这里插入图片描述
在这里插入图片描述
栈顶数据等于popped[j],继续弹出。
在这里插入图片描述
继续该操作
在这里插入图片描述
栈里面为空,所以我们返回true。

代码实现

C语言代码实现

bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
    int* arr = (int*)malloc(pushedSize*sizeof(int));
    int tail = 0;
    int j = 0;
    for(int i = 0; i<pushedSize; i++)
    {
        arr[tail] = pushed[i];
        while(j<poppedSize && tail>=0 && arr[tail] == popped[j])
        {
            tail--;
            j++;
        }
        tail++;
    }
    return tail==0;
}

在这里插入图片描述

Java代码实现

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack<Integer> stack = new Stack<>();
        int j = 0;
        for(int i = 0; i<pushed.length; i++) {
            stack.push(pushed[i]);
            while( j<popped.length && !stack.empty()  && stack.peek().equals(popped[j])) {
                stack.pop();
                j++;
            }
        }
        return stack.empty();
    }
}

在这里插入图片描述

最小栈

leetcode之最小栈(难度:中等)

题目要求

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

这是一幕提供的接口

class MinStack {

    public MinStack() {

    }
    
    public void push(int val) {

    }
    
    public void pop() {

    }
    
    public int top() {

    }
    
    public int getMin() {

    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

用例输入

示例 1:

输入:
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

提示

-231 <= val <= 231 - 1
pop、top 和 getMin 操作总是在 非空栈 上调用
push, pop, top, and getMin最多被调用 3 * 104 次

做题思路

这个题目需要我们使用两个栈,一个栈用来放所有整数,一个的栈顶存放的是最小的整数,叫做最小栈。当我们入栈的时候,当第一次入栈的时候因为最小栈里面是空的,所以我们直接将数据压入栈中,后来入最小栈的时候,我们就需要判断需要入栈的这个数据是否小于最小栈栈顶的数据,如果小于或等于就入栈,否则不入栈。当我们出栈的时候我们还需要对最小栈做出变化,当我们出栈的这个数等于最小栈的栈顶的数据,我们也将最小栈栈顶的数据弹出。后面的返回栈顶的数据,跟栈中的最小值我就不多叙述了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重复此操作
在这里插入图片描述
然后我们在弹出三次栈

弹出的7不等于MinStack栈顶的-1
在这里插入图片描述
-1等于MinStack栈顶的-1,所以MinStack也需要弹出
在这里插入图片描述

在这里插入图片描述

代码实现

因为这道题用C语言实现较复杂,所以我们这个题就直接用Java来实现。

Java代码实现

class MinStack {

    private Stack<Integer> stack;
    private Stack<Integer> minstack;
    public MinStack() {
        stack = new Stack<>();
        minstack = new Stack<>();
    }

    public void push(int val) {
        stack.push(val);
        if(minstack.empty()) {
            minstack.push(val);
        } else {
            if(val <= minstack.peek()) {
                minstack.push(val);
            }
        }
    }

    public void pop() {
    //判断栈是否为空
        if(!stack.empty()) {
        这里我们用Integer防止取出的数据不在-128~127之间
            Integer val = stack.peek();
            stack.pop();
            if(val.equals(minstack.peek())) {
                minstack.pop();
            }
        }
    }

    public int top() {
        if(!stack.empty()) {
            return stack.peek();
        }
        return -1;
    }

    public int getMin() {
        if(!minstack.empty()) {
            return minstack.peek();
        }
        return -1;
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

![在这里插入图片描述](https://img-blog.csdnimg.cn/68c1b0bcc5eb4a3aa488846e7d16af76.pn

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode刷题(5) 的相关文章

随机推荐

  • Mac os使用git,不依赖Xcode

    说明 后来发现使用mac的命令行开发者工具很香 于是又删除了下文安装的git 直接点击下图的 安装 来获取命令行开发者工具 安装路径是 Library Developer CommandLineTools 包含了git gcc g make
  • import com.google.common.* 出错,找不到

    一 问题 在启动项目的时候 import com google common base Preconditions 报错 找不到这个类 二 解决 要引入guavar依赖 Guava 中文是石榴的意思 该项目是 Google 的一个开源项目
  • JavaWeb 相关问题汇总:

    我是目录 1 输入 URL 后发生了什么事情 如何定位服务资源 2 如何接收 HTTP 请求数据 3 ajax有什么作用 4 Filter 过滤器 5 tomcat 1 输入 URL 后发生了什么事情 如何定位服务资源 通过IP找到主机 通
  • 华为OD2023(A卷)基础题27【找数字、找等值元素】

    华为OD机试 找数字 找等值元素 找数字 给一个二维数组nums 对于每一个元素num i 找出距离最近的且值相等的元素 输出横纵坐标差值的绝对值之和 如果没有等值元素 则输出 1 输入描述 输入第一行为二维数组的行 输入第二行为二维数组的
  • java通过经纬度获取区间

    引入依赖
  • python语言程序设计实践教程答案上海交通大学陈东_《C语言程序设计》蔺德军 主著【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者 蔺德军 主著 出版社 辽宁大学出版社 出版时间 2015 11 01 ISBN 9787121274220 版权提供 辽宁大学出版社 基本信息 书名 C语言程序设计上机实验与习题解答 定价 29 00元 售价 18 6元 便
  • 卡内基梅隆大学(CMU),那些经受住时间考验的机器学习论文–第二弹:动态主题模型

    这次 我们要解释一种典型的机器学习算法 动态主题模型 Dynamic Topic Model 概率主题模型和概率图模型是每个做文本挖掘的学者的必学课题 其中最常见的主题模型是隐含狄利克雷分布 LDA 当然 本文的动态主题模型也是主题模型的一
  • Mysql group by 与order by 一起使用

    项目中遇到这样的要求 从数据表里查出每台机器的最后一次链接时间 必须group by机器id order by connect time SELECT c d equipment type FROM ms gateway connect c
  • C++中float和double的比较

    在c 开发中 double或者float类型判断相等性不能简单的用等于符号 进行 一般会采用如下方式进行判断 static inline bool DoubleEqual double a double b return fabs a b
  • Log4j学习笔记

    Log4j学习笔记 1 入门实例 2 Log4j基本使用方法 2 1 定义配置文件 2 2 在代码中使用Log4j 2 3 日志级别 本文参考https blog csdn net u013870094 article details 79
  • 实战--Kafka学习(二)

    问题导读1 Kafka工作包含哪些流程 2 为防止log文件过大导致数据定位效率低下 kafka引入了什么 3 Kafka生产者分区的原因和原则是什么 4 Kafka数据可靠性是如何保证的 3 1 Kafka工作流程及文件存储机制Kafka
  • 哈希及其应用(字典,加密等)

    一 名词说明 Hash 一般翻译做散列 杂凑 或音译为哈希 是把任意长度的输入 又叫做预映射pre image 通过散列算法变换成固定长度的输出 该输出就是散列值 这种转换是一种压缩映射 也就是 散列值的空间通常远小于输入的空间 不同的输入
  • kafka学习

    链接1 Kafka入门教程 香菜 的博客 CSDN博客 链接2 https mbd baidu com ug share mbox 4a83aa9e65 share product smartapp tk d716b5f663babe030
  • mysql函数及关键字使用

    collect set collect set col 函数只接受 基本数据类型 它的主要作用是将某字段的值进行去重汇总 产生array类型字段 MySQL中concat函数 连接字符串 MySQL中concat函数 使用方法 concat
  • java语法基础练习

    1 阅读示例 EnumTest java 并运行 分析结果 代码 public class EnumTest public static void main String args Size s Size SMALL Size t Size
  • MSP432学习笔记:IAR的环境配置(官方demo程序的测试)

    近来入手一块MSP432 折腾了一天 终于把官方demo程序导入IAR 可以愉快的写代码了 以下是我个人的解决办法 首先 如果要使用IAR对TI的单片机进行开发 首先要下载对应的单片机型号的MSPWARE 本人目前使用的是TI的MSP432
  • python实现的一些方法,可以直接拿来用的那种

    1 日期生成 很多时候我们需要批量生成日期 方法有很多 这里分享两段代码 获取过去 N 天的日期 import datetime def get nday list n before n days for i in range 1 n 1
  • 梯度下降算法

    下面这篇文章讲的非常不错 https www jianshu com p c7e642877b0e 转载于 https www cnblogs com lvchaoshun p 11403808 html
  • 【网络】协议定制+序列化/反序列化

    为什么要序列化 如果光看定义很难理解序列化的意义 那么我们可以从另一个角度来推导出什么是序列化 那么究竟序列化的目的是什么 其实序列化最终的目的是为了对象可以跨平台存储 和进行网络传输 而我们进行跨平台存储和网络传输的方式就是IO 而我们的
  • leetcode刷题(5)

    各位朋友们 大家好 今天是我leedcode刷题的第五篇 我们一起来看看吧 文章目录 栈的压入 弹出序列 题目要求 用例输入 提示 做题思路 代码实现 C语言代码实现 Java代码实现 最小栈 题目要求 用例输入 提示 做题思路 代码实现