当前位置: 首页 > 编程日记 > 正文

实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈

一,问题描述

实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时,栈的基本操作:入栈(Push)、出栈(Pop),也是在O(1)时间内完成的。

二,问题分析

之所以认为这个问题有趣,是因为在实现 min 方法的过程 牵涉到了 “缓存一致性”问题。是不是听起来很高大上?哈哈,我臆想的。

思路1:添加一个成员变量总是保存当前栈中最小的元素。该思路的实现代码大致是这样的:

public class MinStack {private LinkedList<Integer> stack;private int min;// save minimum ele of stackpublic int pop(){//check pop minimum ele?
    }public void push(int ele){//check push minimum ele?
    }public int getMin(){return min;}
}

这里就会存在一个问题:保存最小元素的 min 属性 与 栈中的最小元素不一致。

比如:当从栈中 pop 最小元素时,那 min 属性就要 保存 次最小元素了。那如何 找到次最小元素,然后赋值给 min 呢?

因此,问题的关键就是:当只使用一个 min 属性时,如何保证 min 属性 总是 保存的是当前栈中最小的元素?---即: min 代表的最小元素 要与 栈中的最小元素保存一致。一种方式是当pop出最小元素之后,再遍历栈找出次最小的元素,并将之赋值给 min 。但是,由于遍历使得时间复杂度不再是O(1)

思路2:

使用一个辅助栈。此方法能够实现在O(1)时间内获取栈中最小的元素,但是缺点是空间复杂度为O(N)

现在有两个栈:一个是保存元素的数据栈,另一个是辅助栈,辅助栈的栈顶总是 当前数据栈中最小的元素。当Push元素时,首先将该元素Push到数据栈,然后再将该元素与辅助栈的栈顶元素比较:如果该元素比辅助栈的栈顶元素小,则将该元素Push到辅助栈中;否则将辅助栈的栈顶元素再Push到辅助栈中。

比如,现在要Push的元素顺序如下:3,4,2,5....   在数据栈 和 辅助栈中保存的元素如下:

三,代码实现

代码中使用了 java.util.LinkedList 类作为 栈的实现。

import java.util.LinkedList;public class MinStack {private LinkedList<Integer> dataStack;private LinkedList<Integer> minStack;public MinStack() {dataStack = new LinkedList<Integer>();minStack = new LinkedList<Integer>();}//base operationpublic void push(int ele){dataStack.push(ele);if(minStack.size() == 0 || ele < minStack.peek())minStack.push(ele);elseminStack.push(minStack.peek());}public Integer pop(){if(dataStack.isEmpty())return null;assert dataStack.isEmpty() == false && minStack.isEmpty() == false;int ele = dataStack.pop();minStack.pop();return ele;}public Integer min(){if(minStack.isEmpty())return null;return minStack.peek();}//hapjin testpublic static void main(String[] args) {MinStack stack = new MinStack();int[] eles = {3,4,2,5};for (int i : eles) {stack.push(i);}System.out.println(stack.min());//2System.out.println(stack.pop());//5System.out.println(stack.pop());//2System.out.println(stack.min());//3stack.push(1);System.out.println(stack.min());}
}

转载于:https://www.cnblogs.com/hapjin/p/5783536.html

相关文章:

华为js面试题_四面腾讯与华为,大厂前端面试真BT!

今年算是经历颇多的一年了&#xff0c;腾讯和华为都走了几趟&#xff08;一共面试了四个部门&#xff09;&#xff0c;拿了两个offer。&#xff08;开心.png&#xff09;&#xff0c;但还是挂了两次&#xff0c;有点遗憾。面试题总结面试完之后&#xff0c;赶紧总结了一波&…

你和区块链的距离就差这篇文章!

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 近年来&#xff0c;“区块链”逐渐成为热门话题&#xff0c;2018年各种关于区块链的行业资讯、投融资创业、技术和应用探索等集中爆发&#xff0c;…

Browser Security-超文本标记语言(HTML)

重要的4个规则&#xff1a; 1 &符号不应该出现在HTML的大部分节点中。 2 尖括号<>是不应该出现在标签内的&#xff0c;除非为引号引用。 3 在text节点里面&#xff0c;<左尖括号有很大的危害。 4 引号在标签内可能有危害&#xff0c;具体危害取决于存在的位置&…

NestedScrolling CoordinatorLayout

Android NestedScrolling机制完全解析 带你玩转嵌套滑动 一步一步深入理解CoordinatorLayout 源码看CoordinatorLayout.Behavior原理 转载于:https://www.cnblogs.com/cornellbox/p/8649891.html

python下载电脑版本不对_初学Python,因为某些原因电脑只能装3.1版本,现遇到这个小问题求解答...

#!/usr/bin/env python # -*- coding: utf-8 -*-任务: 假设用户输入的英文名字不规范&#xff0c;没有按照首字母大写&#xff0c;后续字母小写的规则&#xff0c; 请利用map()函数&#xff0c;把一个list&#xff08;包含若干不规范的英文名字&#xff09;变成一个包含规范英文…

以太坊是什么?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 以太坊是一个全新开放的区块链平台&#xff0c;它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用。就像比特币一样&#xff0c;以…

前端相关html和css

#请参考http://www.cnblogs.com/pycode/p/5792142.html #html css 和js说明 ##1.什么是html&#xff1f; HTML(HyperText MarkUp Language)超文本标记语言,通过使用标记来描述文档结构和表现形式的一种语言,由浏览器进行解析,然后把结果显示在网页上&#xff0c;通俗的讲它就是…

编写五子棋的完整python代码_python制作简单五子棋游戏

本文实例为大家分享了python五子棋游戏的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 #五子棋 ‘” 矩阵做棋盘 16*16 “” 打印棋盘 for for 游戏是否结束 开始下棋 while 游戏是否结束&#xff1a; 黑白交替 player0 p%20 1 p1 下棋动作一样 但是棋子不一样 ‘”…

新建JRapid项目(idea创建maven多模块项目)

1、第一步&#xff0c;新建项目&#xff08;Create New Project&#xff09; 2、parent项目&#xff0c;不勾选“Crate from archetype”&#xff0c;直接单击“Next”。 3、groupid填写com.codingwhy&#xff0c;ArtifactId填写JRapid。 4、Project name 填写 JRapid&#xff…

这个美国议员候选人想发币,联邦选举委员会还答应了

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 佛罗里达州的一名国会候选人想给竞选志愿者发放基于以太坊的代币&#xff0c;以激励他们的工作&#xff0c;这是一项实验性的举措&#xff0c;而联邦…

day8 函数

写代码先画流程图 复习&#xff1a; 什么是文件&#xff1f; 文件操作 read&#xff08;&#xff09; with open&#xff08;&#xff09;as f: 取代close&#xff08;&#xff09; 文件的打开模式 t:text文本模式 只能操作文本 b:bytes字节模式 视频音频图片&#xff0c;也…

SQL Server中的分页查询

分页查询很简单&#xff0c;具体代码如下&#xff1a; --分页查询--查询1-3行数据 select top 3 * from emp order by sal desc;--查询4-6行数据 select top 3 *from empwhere empno not in (select top 3 empno from emp order by sal desc)order by sal desc;--查询7-9行数据…

python数据库建表_mysql数据表如何创建

在 MySQL 中&#xff0c;可以使用 CREATE TABLE 语句创建表。其语法格式为&#xff1a;CREATE TABLE <表名> ([表定义选项])[表选项][分区选项]; 其中&#xff0c;[表定义选项]的格式为&#xff1a;<列名1> <类型1> [,…] <列名n> <类型n> CREAT…

行情分析:下杀或不可持续,市场大概率继续震荡

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 美联储主席杰罗姆鲍威尔周三在众议院金融服务委员会的听证会上表示&#xff0c;在Facebook详细说明如何处理一系列监管问题之前&#xff0c;不应允许…

水平,垂直居中的15种方法

一.水平居中 1.文字水平居中 <div class"one">测试居中</div><style>.one{width: 200px;height: 100px;border:1px solid red;text-align: center;}</style>2.盒子居中 <div class"one">是盒子居中</div><style>…

Hadoop葵花宝典(一)

1. 描述如何安装配置Hadoop 参考&#xff1a;http://www.cnblogs.com/xia520pi/archive/2012/04/08/2437875.html 安装Linux(虚拟机上)—CentOS&#xff1a;创建用户&#xff0c;关闭防火墙&#xff0c;PS&#xff1a;不关防火墙无法访问Web管理页面&#xff0c;删除和增加节点…

stata命令汇总_第九届高级计量经济学及stata应用研讨会在京顺利举办

二零一九&#xff0c;寒假佳时&#xff0c;近30余所高校的师生齐聚北京&#xff0c;参加了计量经济学服务中心举办的第九届“高级计量经济学及Stata应用”现场研讨班。本届研讨班于2019年1月19日-1月22日在北京国际温泉酒店顺利举办&#xff0c;现场学员既有博士、硕士&#xf…

下轮牛市高峰可能在2020年,以太坊是关键

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 “用自己一颗宁静的内心去感受市场真正的趋势&#xff0c;一旦发现趋势便全力跟随之。—刘强《期货大作手风云录》” 文章导读&#xff1a; 驱动这…

jQuery中的事件机制深入浅出

昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScript中调用是原生的函数方法,而jQuery中调用的绑定的是jQuery中的对象方法,那么在昨天的第一篇中,我们已经…

滑动加载商品列表

商品列表htmL 所绑定的js事件 后台代码 $(function () { //滚动加载 var stop true; var start 2; // $.ajaxSetup({async:false}); function getData(url){ // console.log(url); $.ajax({ type:"get",//跨域访问时只能用get url:url,//要访问的api地址 dataType:…

mac 怎么查找大于200m的文件_U盘无法拷贝大于4GB的文件怎么办?

相信在经常使用U盘的用户手中&#xff0c;都会或多或少的存有几个U盘&#xff0c;有时候如果我们需要重装系统的时候&#xff0c;就会发现下载的系统居然无法拷贝到U盘当中&#xff0c;这究竟是怎么回事呢&#xff1f;U盘主要有三种格式&#xff1a;FAT32&#xff1a;缺点&…

以太坊今日大涨7.5%,芝商所备战“以太坊期货”

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 据The Block报道&#xff0c;芝加哥商品交易所&#xff08;CME&#xff09;预计将于7月15日改变以太坊相关的参考利率和指数&#xff0c;消息人士称…

python package_Python之package、module

一、模块&#xff1a; 1.简单的描述&#xff1a;一个.py文件 2.好处&#xff1a;大大提高代码的可维护性 3.模块三种&#xff1a;1.python标准库 2.第三方模块 3.应用程序自定义模块&#xff08;*****&#xff09; 4.import实质就是&#xff1a;1.执行对应文件 2.引入变量名 在…

C# Timer使用方法示例

实例化一个timer&#xff1a; // 每5分钟执行一次,每次执行的间隔毫秒时长 System.Timers.Timer timer new System.Timers.Timer(5*60*1000);为timer设置事件和任务循环回调方法&#xff1a; //到达时间的时候执行事件timer.Elapsed new System.Timers.ElapsedEventHandler(T…

[Educational Codeforces Round 16]A. King Moves

[Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board. You are given his position in format "cd", where c is the column from a to h and dis the row from 1 to 8. Find the number of moves permitted…

解读Go语言的2018:怎么就在中国火成这样了?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 本篇文章是 Go 语言 2018 年终盘点&#xff0c;力求客观、深入分析 2018 年 Go 语言的技术发展现状&#xff0c;同时对明年可能的发展情况进行预测…

Io流的字节流与缓冲流

当我们队大量数据进行保存时可以用数组&#xff0c;当数据到达一定量时或给用户一个易懂得接口时就可采用IO流&#xff1a; IO流按进行的操作分输出流与输入流InputStream与OutputSteam 按操作的原理来分有2种常见的IO流字节流与缓冲流&#xff1a;这2种IO的的输入输出流都是对…

057 Insert Interval 插入区间

给出一个无重叠的按照区间起始端点排序的区间列表。在列表中插入一个新的区间&#xff0c;你要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。示例 1:给定区间 [1,3],[6,9]&#xff0c;插入并合并 [2,5] 得到 [1,5],[6,9]…

python3笔记_python3基础笔记(一)

1、就单个 python 文件来说在 python 中 python 的后缀可以是任意的。但如果这个 python 文件需要导入的时候如果不是 .py 会出错。所以一般情况下 python 文件的后缀为 .py 2、是 linux 中使用 ./文件.py 时候需要在文档的第一行注明解释器路径 # !/usr/bin/env/ python 3、声…

django中使用celery简单介绍

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 本章节我们重点在于实现&#xff0c;如何存储任务的结果. 我们将任务函数改为: from celery_demo.celery import app import time 加上app对象…