JS Leetcode 155. 最小栈 题解分析
壹 ❀ 引
本题来自LeetCode155. 最小栈,难度简单,题目描述如下:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。示例:
输入:
["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.
提示:
pop、top 和 getMin 操作总是在 非空栈 上调用。
贰 ❀ 使用数组API模拟
题目要求其实很简单,自己实现一个支持入栈,出栈,获取栈顶元素以及获取栈内最小元素的栈结构。
我们都知道栈是先进后出,就像俄罗斯方块一样,先入栈的总是在栈底,所以出栈时,总是最后入栈的先出栈,最后出栈的总是最早入栈的元素。因此我们完全可以使用一个数组模拟这个过程,我们使用shift
模拟出栈,使用unshift
模拟入栈,top
是获取栈顶元素,这里我们可以直接使用arr[0]
来实现这个方法,抛开题目使用常数时间检索最小值的要求,其实我们可以使用Math.min
来检索栈内最小元素。
废话不多说,先上一个基本实现的代码:
/**
* initialize your data structure here.
*/
var MinStack = function() {
this.nums = [];
};
/**
* @param {number} val
* @return {void}
*/
MinStack.prototype.push = function(val) {
// 模拟入栈
this.nums.unshift(val);
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
// 模拟出栈
this.nums.shift();
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
// 模拟top
return this.nums[0];
};
/**
* @return {number}
*/
MinStack.prototype.getMin = function() {
return Math.min(...this.nums);
};
以上代码能满足基本要求,但并未达到查找最小数时常数时间的要求。何为常数时间复杂度,其实就是O(1)
。我们往栈内添加元素的行为只有一种,也就是push
,所以如果要达到要求,其实可以在这一步做点小操作,比如每次入栈的时候都计算当前的最小值,并随着当前入栈的值组成一个新数组,一起入栈。
假设我们入栈操作一共做了三次,入栈的数字为1,3,0,那么这个过程就是:
1开始入栈了,由于此时是空栈,那么最小值就是1自己,于是我们入栈元素为[1,1]
,整个栈此时为[[1,1]]
3开始入栈了,此时栈并不是空栈,最小值自然是栈顶元素[1,1][1]
与3做比较,很明显1更小,于是入栈[3,1]
,此时栈为[[3,1],[1,1]]
。
0开始入栈了,栈顶元素的第二个数字永远是当前栈的最小值,因此我们需要拿0和1比较,很明显0更小,于是入栈[0,0]
,此时栈为[[0,0],[3,1],[1,1]]
。
如果我们要获取当前栈最小元素,永远可以通过获取栈顶元素的第二个数字,它就是当前最小数。假设[0,0]
出栈了,那么当前最小数就是1,完全没问题。
让我们实现这个代码:
/**
* initialize your data structure here.
*/
var MinStack = function () {
this.nums = [];
};
/**
* @param {number} val
* @return {void}
*/
MinStack.prototype.push = function (val) {
// 假设是空栈,最小的就是自己,反之与栈顶元素的第二个数字进行比较
if (this.nums.length) {
this.nums.unshift([val, Math.min(val, this.nums[0][1])])
} else {
this.nums.unshift([val, val]);
};
};
/**
* @return {void}
*/
MinStack.prototype.pop = function () {
this.nums.shift();
};
/**
* @return {number}
*/
MinStack.prototype.top = function () {
return this.nums[0][0];
};
/**
* @return {number}
*/
MinStack.prototype.getMin = function () {
// 常数时间获取栈内最小值
return this.nums[0][1];
};
那么本题就分析到这里了。
JS Leetcode 155. 最小栈 题解分析的更多相关文章
- Java实现 LeetCode 155 最小栈
155. 最小栈 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) – 将元素 x 推入栈中. pop() – 删除栈顶的元素. top() – 获取 ...
- LeetCode 155 - 最小栈 - [数组模拟栈]
题目链接:https://leetcode-cn.com/problems/min-stack/description/ 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的 ...
- leetcode 155. 最小栈(c++)
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中.pop() -- 删除栈顶的元素.top() -- 获取栈顶元素.get ...
- LeetCode——155. 最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...
- 【LeetCode】155. 最小栈
155. 最小栈 知识点:栈:单调 题目描述 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删 ...
- leetcode算法学习----155. 最小栈(MinStack )
下面题目是LeetCode算法155题: https://leetcode.com/problems/min-stack/ 题目1:最小函数min()栈 设计一个支持 push,pop,top 操作, ...
- Leetcode题目155.最小栈(简单)
题目描述: 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中.pop() -- 删除栈顶的元素.top() -- 获取栈顶 ...
- LeetCode 刷题笔记 155. 最小栈(Min Stack)
tag: 栈(stack) 题目描述 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素 ...
- 【LeetCode】最小栈
[问题] 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈 ...
- leadcode的Hot100系列--155. 最小栈
栈:先入后出,后入先出 像电梯一样,先进入电梯的,走到电梯最深处,后进入电梯的,站在电梯门口, 所以电梯打开的时候,后进入的会先走出来,先进入的会后走出来. push,对应入电梯,把数据往里面压 po ...
随机推荐
- docker 原理之 user namespace(下)
1. user namespace user namespace 主要隔离了安全相关的标识符和属性,包括用户 ID,用户组 ID,key 和 capabilities 等.同样一个用户 id 在不同 ...
- Apache ShardingSphere 实现分库分表及读写分离
本文为博主原创,未经允许不得转载: 项目demo 源码地址:https://gitee.com/xiangbaxiang/apache-shardingjdbc 1. 创建Maven项目,并配置 po ...
- 基于python+django的家教预约网站-家教信息管理系统设计与实现
该系统是基于python+django开发的家教预约网站.是给师妹做的课程作业.大家在学习过程中,遇到问题可以在github给作者留言. 效果演示 前台地址: http://jiajiao.gitap ...
- SV interface and Program3
时钟域的理解 在仿真过程中,时钟跳变的一瞬间,CPU将时间域划分为不同的时钟域执行不同的代码 信号在芯片中都是金属丝,在进行跳变的时候都是电容的充放电过程,通常使用时钟上升沿进行模拟,而不使用时钟下降 ...
- 基于AHB_BUS的eFlash控制器设计-软硬件系统设计
eFlash软硬件系统设计 软硬件划分 划分好软硬件之后,IP暴露给软件的寄存器和时序如何? 文档体系:详细介绍eflash控制器的设计文档 RTL代码编写:详细介绍eflash控制器的RTL代码 1 ...
- Kafka 社区KIP-382中文译文(MirrorMaker2/集群复制/高可用/灾难恢复)
译者:对于Kafka高可用的课题,我想每个公司都有自己的方案及思考,这是一个仁者见仁智者见智的命题,而社区给出了一个较大的特性,即MirrorMaker 2.0,不论是准备做高可用还是单纯的数据备份, ...
- [转帖]Java 提速之 Large pages【译】
https://juejin.cn/post/7011002046899978253 一.前言 最近花了很多时间在 JVM 的内存预留代码上.它开始是因为我们得到了外部贡献,以支持在 Linux 上使 ...
- 监控服务器所有磁盘的inode使用情况
监控服务器所有磁盘的inode使用情况 背景 因为前期数据库开启了审计 但是如果是 DB模式的话 $aud 表的冲突和使用太多了 所以专家建议将审计表放到OS 因为数据库的访问量特别高. 审计的信息又 ...
- [转帖]linux中Shell日期转为时间戳的方法
http://www.nndssk.com/xtwt/169617hFPRvq.html shell中获取时间戳的方式为:date -d "$currentTime" +%s $ ...
- [百度贴吧]部分CPU的SPEC2006int 结果
这些测试成绩基本上是本人自己测试的结果.下表中有来自spec官网的两个成绩,因为测试年份较早,系统环境和编译器都较老,测试成绩本人实测的还差,所以仅作为参考.部分测试启用了自动并行和附加的优化库,是为 ...