20140920百度筆試題---實現static

題目:

實現一個stack,要求要有min函數實現,該實現複雜度要求O(1)。

要求是要有stack的基本功能,同時加一個能獲取最小值的函數,實現複雜度度要求O(1)。一開始的想法就是在stack類中維護一個最小值min,每次插入一個值就判斷是否比當前最小值還小,是的話就替代最小值,然後再pop棧頂元素時,重新計算最小值(需要遍歷)。這種方法很容易想到,但是明顯效率很低,因爲每次pop操作的時候需要O(n)複雜度來求最小值。所以應該找更優化的方法。先看我的實現代碼:

class stack_z
{
private:
	int* s;//存儲棧的元素
	int* previous_min;//存儲之前的最小值,previous_min[i]表示在s[i]成爲最小值(如果有這種情況)之前棧的最小值
	int max_size;//棧的長度
	int size;//棧元素個數
	int min;//最小值
public:
	stack_z(int n)
	{
		s = new int[n];
		previous_min = new int[n];
		max_size = n;
		size = 0;
		min = MIN_VALUE;
	}
	void push(int value)
	{
		if(size >= max_size)
			cout << "The stack is full!" << endl;
		else
		{
			if(value < min)
			{
				previous_min[size] = min;//將之前的最小值存起來
				min = value;
			}
			s[size++] = value;
		}
	}
	void pop()
	{
		if(size == 0)
			cout << "The stack is empty!" << endl;
		else
		{
			if(min == s[size - 1])
				min = previous_min[size - 1];//由於最小值被pop掉,新的最小值由之前的最小值代替
			size--;
		}
	}
	int _min()
	{
		return min;
	}
	int top()
	{
		if(size == 0)
		{
			cout << "The stack is empty!" << endl;
			return -1;
		}
		return s[size - 1];
	}
	int _size()
	{
		return size;
	}
	bool empty()
	{
		return size == 0;
	}
};
push一個元素時,如果該元素的值比最小值小,那麼應該由該元素替代最小值,此時用previous_min[index](index爲新元素的數組下標)存儲之前的最小值,這樣當pop元素剛好是最小值的時候就可以用之前的最小值previous_min[index]替換最小值min。維護和取值複雜度都是O(1)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章