博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cc++ leetcode 155.最小栈
阅读量:3965 次
发布时间:2019-05-24

本文共 2171 字,大约阅读时间需要 7 分钟。

c/c++ leetcode 155.最小栈

题目描述:

难度简单634

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

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。

解法一:双栈

class MinStack {    stack
s; stack
minStack; int t;public: /** initialize your data structure here. */ MinStack() { //先在最小栈里存放int 类型的最大数值//如果不存,也是可以的,需要加一个minStack.empty()的判断 //如果为空x就不需要与minStack判断 minStack.push(INT_MAX); } void push(int x) { s.push(x); //如果最小栈的栈顶元素小于x 就再次把最小栈的栈顶元素进栈 否则就把x 进栈 minStack.push(min(minStack.top(),x)); } void pop() { s.pop(); minStack.pop(); } int top() { return s.top(); } int getMin() { return minStack.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(); */

另一个版本

国外友人的杰作链接:https://leetcode.com/problems/min-stack/discuss/49016/C%2B%2B-using-two-stacks-quite-short-and-easy-to-understand

class MinStack {private:    stack
s1; stack
s2;public: void push(int x) { s1.push(x); if (s2.empty() || x <= getMin()) s2.push(x); } void pop() { //在这里判断一下就是s2最小栈 二个栈中栈顶元素相同最小栈中的元素才会出栈; if (s1.top() == getMin()) s2.pop(); s1.pop(); } int top() { return s1.top(); } int getMin() { return s2.top(); }};

时空复杂度分析:

时间复杂度:对于题目中的所有操作,时间复杂度均为 O(1)。因为栈的插入、删除与读取操作都是 O(1),插入和删除也都是常数级别的时间复杂度;

空间复杂度 :N 为进栈的最多的个数。最坏情况下,光进栈不出栈,此时两个栈占用的空间为 O(2n)去掉常数 也就是O(N);

解法二.用一个栈来存储一个键值对

这也是一个国外友人的一个杰作链接:https://leetcode.com/problems/min-stack/discuss/49221/C%2B%2B-solution-using-pair-and-one-stack

也是一个对于STL熟悉的老手了

class MinStack {     stack
> st;public: void push(int x) { int min; if (st.empty()) { min = x; } else { min = std::min(st.top().second,x); } st.push({x, min}); } void pop() { st.pop(); } int top() { return st.top().first; } int getMin() { return st.top().second; }};

时间复杂度都一样

转载地址:http://udyki.baihongyu.com/

你可能感兴趣的文章
Go - goose 数据库迁移工具
查看>>
SQL - SQL Server 之遍历数据集合的几种方法
查看>>
SQL - SQL Server 之处理JSON数据
查看>>
SQL - SQL Server 之ETL详解
查看>>
SQL - SQL Server 之Merge函数使用详解
查看>>
SQL - SQL Server 之WHILE循环的坑
查看>>
SQL - SQL Server中如何获取当前年,月,日,时,分,秒
查看>>
SQL - SQL Server 性能优化之SQL语句总结
查看>>
Docker - docker-compose常用命令
查看>>
SQL - SQL Server判断字符串中是否有中文
查看>>
SQL - SQL Server查询近7天的连续日期
查看>>
SQL - SQL Server中如何取年、月、日 -DATEPART函数
查看>>
SQL - SQL Server 一列或多列重复数据的查询,删除
查看>>
NET - .NET Core WebAPI + Vue + Axios 导出Excel / CSV
查看>>
NET - NET Core Quartz.net开源作业调度框架使用详解
查看>>
NET - NET Core quartz.net 时间表达式----- Cron表达式详解
查看>>
NET - .NET Core 之 Abp Audit-Logging
查看>>
NET - .NET Core 之 Abp AuditLog 将不同的Controller实体的审计日志存储到不同的Table
查看>>
NET - .NET Core 之 Azure Key Vault 密钥保管库的使用
查看>>
NET - .NET Core 之 Abp 整合 Quartz
查看>>