面试题——包含min函数得栈

AcWing 41 包含 min 函数得栈

题目

设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。

  • push(x)–将元素x插入栈中
  • pop()–移除栈顶元素
  • top()–得到栈顶元素
  • getMin()–得到栈中最小元素

样例

MinStack minStack = new MinStack();
minStack.push(-1);
minStack.push(3);
minStack.push(-4);
minStack.getMin();   --> Returns -4.
minStack.pop();
minStack.top();      --> Returns 3.
minStack.getMin();   --> Returns -1.

思路

​ 首先我们要了解栈是一个什么样得数据结构,栈是一种先入后出得数据结构,它类似于一个一端封闭得容器,我们只能从一个入口向容器中放入元素,也只能从这个入口取出元素,且取出得元素一定是上一次放入操作放入的元素

​ 回归这个问题,我们怎么实现一个包含压栈(push)、出栈(pop)、获取栈顶元素(top)、和获取当前栈中最小元素(getMin)这四种方法呢?

​ 我们这里采用数组模拟栈,用数组模拟栈的好处是便捷,并且在不很复杂的问题中对数组模拟栈进行操作可以节省运算时间和运算成本,我们定义一个长度足够的数组stk用来表示栈,用一个int类型的变量tt表示栈顶的索引位置,当我们创建一个空栈时,这个指针应该指向0这个位置,每次我们进行压栈操作,++tt,每次我们出栈,--tt,获取栈顶元素时,我们只需要然会stk[tt - 1]即可

​ 最关键的问题时如何找到当前栈中的最小值,如果没有时间限制的话,我们可以通过遍历栈的方式找到最小值,但是这道题的时间限制是O(1),我们可以考虑,另外开辟一个数组stkmin,用这个数组来存储当前栈的最小值,每当我们在栈中压入一个数,我们就检测压入的元素是否比stkmin的栈顶元素小,如果是,那么新压入的元素便是最小值,否则原栈顶元素是最小值,而当stk中有元素出栈时,我们也同样只需要让stkmin的栈顶元素出栈即可,所以stkmin的栈顶元素就是stk中的最小值,下面是代码:

代码

class MinStack {
public:

	int stk[100010];
	int stkmin[100010];
	int tt;

	/** initialize your data structure here. */
	MinStack() {
		tt = 0;
	}

	void push(int x) {
		if (tt == 0)
			stkmin[tt] = x;
		else
			if (stkmin[tt - 1] >= x)
				stkmin[tt] = x;
			else
				stkmin[tt] = stkmin[tt - 1];
		stk[tt++] = x;
	}

	void pop() {
		--tt;
	}

	int top() {
		return stk[tt - 1];
	}

	int getMin() {
		return stkmin[tt - 1];
	}
};
发布了72 篇原创文章 · 获赞 89 · 访问量 6523

猜你喜欢

转载自blog.csdn.net/scfor333/article/details/104951059
今日推荐