面試題——包含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];
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章