码迷,mamicode.com
首页 > 其他好文 > 详细

20140920百度笔试题---实现static

时间:2014-09-21 13:18:10      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:百度   笔经   

题目:

实现一个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)。

20140920百度笔试题---实现static

标签:百度   笔经   

原文地址:http://blog.csdn.net/u012999424/article/details/39449225

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!