[LeetCode][155]【学习日记】最小栈——记录每个时刻的最小值

2024-03-07 07:20

本文主要是介绍[LeetCode][155]【学习日记】最小栈——记录每个时刻的最小值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

最小栈

请你设计一个最小栈。它提供pushpoptop操作,并能在常数时间内检索到最小元素的栈。

实现MinStack类:

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

输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[2],[-3],[],[],[],[]]
输出: [null,null,null,null,-3,null,2,-2]
解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(2); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 2. minStack.getMin(); --> 返回 -2.

提示:

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

注意: 本题与主站 155 题相同:https://leetcode-cn.com/problems/min-stack/

解法1:使用 map 排序并统计

  • 利用 map 自动排序的特点,将栈元素值作为 key,压栈时对应的 key 的 value 自增,需要查询最小值的时候返回第一个元素即可
  • 出栈时,对应的 key 的 value 自减,为 0 时则删除这个键值对,表示栈中没有这个数值的元素
  • 这个解法的缺点是,保存了所有元素的计数值,但是其实有一些元素的计数值是不需要保存的,解法2 解决了这个问题
class MinStack {vector<int> vec;map<int,int> m;public:/** initialize your data structure here. */MinStack() {}void push(int x) {vec.push_back(x);if(m.find(x)==m.end()) m[x]=1;else m[x]++;}void pop() {int temp = vec.back();vec.pop_back();if(!(--m[temp])) m.erase(temp);}int top() {return *(vec.end()-1);}int getMin() {return (*m.begin()).first;}
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(x);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/

解法2:只保留每个时刻栈中的最小元素

  • 由于出栈必须按照一定的顺序,所以只需要在入栈的时候保存每一次入栈后的最小值,就可以方便地在出栈的时候进行最小值的更新
    在这里插入图片描述
class MinStack {stack<int> s, minS;
public:/** initialize your data structure here. */MinStack() {}void push(int x) {s.push(x);if(minS.empty() || minS.top()>=x) minS.push(x);}void pop() {if(minS.top()==s.top()) minS.pop();s.pop();}int top() {return s.top();}int getMin() {return minS.top();}
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(x);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/

这篇关于[LeetCode][155]【学习日记】最小栈——记录每个时刻的最小值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/782762

相关文章

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n