最小栈

描述

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

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

示例

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

解题思路

题目重点

在检索最小元素时,算法时间复杂度需要是常数时间(O(1));那么就需要在存储数据的时候,就要把最小元素存储起来。
针对这点,在设计数据结构时就有以下几种思路:
1: 使用两个列表或者数组,分别存储存储的元素以及插入当前元素时存在的最小元素相关信息(例如:最小元素的下标或者最小元素本身)【需要两个数据结构或者一个数据结构将数据交叉存储】
2: 创建一个元素类,将当前存储的元素和最小元素作为内部变量;再使用数据结构存储元素类的变量【需要一个数据结构,结构可能看起来更加简明】
3: 使用栈来存储当前存入的元素,只不过需要将插入元素和当前的最小值交叉存储【最简单的一种方式】

代码实现

1:分别存储插入元素和当前最小元素

public class MinStack {
	public static void main(String[] args) {
		MinStack minStack = new MinStack();
        minStack.push(-2);
        minStack.push(0);
        minStack.push(-3);
        System.out.println("min: "+minStack.getMin());
        minStack.pop();
        System.out.println("top: "+minStack.top());
        System.out.println("min: "+minStack.getMin());
	}
	
	private int mNum;
	private int mMin;
	private int mMinIndex;
	private List<Integer> list;
	private List<Integer> mMinIndexs;

	public MinStack() {
		list = new ArrayList<>();
		mMinIndexs = new ArrayList<>();
    }
    
    public void push(int x) {
    	mNum ++;
    	list.add(x);
    	if (mNum == 1) { 
			mMin = x;
			mMinIndex = 0;
		} else {
			if (x > mMin) {
			} else {
				mMin = x;
				mMinIndex = mNum - 1;
			}
		}
    	mMinIndexs.add(mMinIndex);
    }
    
    public void pop() {
    	if (mNum > 0) {
        	list.remove(mNum - 1);
        	mMinIndexs.remove(mNum - 1);
        	mNum --;
        	if (mNum > 0) {
        		mMinIndex = mMinIndexs.get(mNum - 1);
            	mMin = list.get(mMinIndexs.get(mMinIndex));
        	} else {
        		mMin = 0;
        		mMinIndex = 0;
        	}
    	}
    }
    
    public int top() {
    	if (mNum > 0) {
        	return list.get(mNum - 1);
    	}
    	return Integer.MIN_VALUE;
    }
    
    public int getMin() {
    	if (mNum > 0) {
    		return list.get(mMinIndexs.get(mNum - 1));
    	}
    	return Integer.MIN_VALUE;
    }
}

在上边的代码中需要分别维护两个list,操作稍显复杂。

2:创建一个元素类

public class MinStack {
	public static void main(String[] args) {
		MinStack minStack = new MinStack();
        minStack.push(-2);
        minStack.push(0);
        minStack.push(-3);
        System.out.println("min: "+minStack.getMin());
        minStack.pop();
        System.out.println("top: "+minStack.top());
        System.out.println("min: "+minStack.getMin());
	}
	
	private int mMin = Integer.MAX_VALUE;
	private List<Element> list;
	
	public MinStack() {
		list = new ArrayList<>();
    }
    
    public void push(int x) {
    	Element element = new Element();
    	element.item = x;
    	
    	if (x > mMin) {
			element.minItem = mMin;
		} else {
			element.minItem = x;
			mMin = x;
		}
    	list.add(element);
    }
    
    public void pop() {
    	if (list != null && !list.isEmpty()) {
			list.remove(list.size() - 1);
		}
    	if (list.isEmpty()) {
			mMin = Integer.MAX_VALUE;
		} else {
			mMin = list.get(list.size() - 1).minItem;
		}
    }
    
    public int top() {
    	if (list != null && !list.isEmpty()) {
			return list.get(list.size() - 1).item;
		}
    	return Integer.MIN_VALUE;
    }
    
    public int getMin() {
    	if (list != null && !list.isEmpty()) {
			return list.get(list.size() - 1).minItem;
		}
    	return Integer.MIN_VALUE;
    }
    
    private class Element{
    	public int item;
    	public int minItem;
    }
}

在方法二中代码稍微比方法一的简洁易懂一些

使用栈存储

这种实现的方式比较简单,这里不再使用代码实现;只是提供一种思路

总结

在上边两种方法中一定要注意在 pop() 方法中一定要将 mMin 重新赋值为列表的最后一个元素。
因为这个原因导致在验证代码的时候出了几次问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生就业服务平台管理系统按照操作主体分为管理员和用户。管理员的功能包括学生档案管理、字典管理、试卷管理、试卷选题管理、试题表管理、考试记录表管理、答题详情表管理、错题表管理、法律法规管理、法律法规收藏管理、法律法规留言管理、就业分析管理、论坛管理、企业管理、简历管理、老师管理、简历投递管理、新闻资讯管理、新闻资讯收藏管理、新闻资讯留言管理、学生信息管理、宣传管理、学生管理、职位招聘管理、职位收藏管理、招聘咨询管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生就业服务平台管理系统可以提高大学生就业服务平台信息管理问题的解决效率,优化大学生就业服务平台信息处理流程,保证大学生就业服务平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理新闻信息,管理大学生就业服务平台信息,包括考试管理,培训管理,投递管理,薪资管理等,可以管理新闻信息。 考试管理界面,管理员在考试管理界面中可以对界面中显示,可以对考试信息的考试状态进行查看,可以添加新的考试信息等。投递管理界面,管理员在投递管理界面中查看投递种类信息,投递描述信息,新增投递信息等。新闻信息管理界面,管理员在新闻信息管理界面中新增新闻信息,可以删除新闻信息。新闻信息类型管理界面,管理员在新闻信息类型管理界面查看新闻信息的工作状态,可以对新闻信息的数据进行导出,可以添加新新闻信息的信息,可以编辑新闻信息信息,删除新闻信息信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值