其他分享
首页 > 其他分享> > 《剑指Offer》30-包含min函数的栈

《剑指Offer》30-包含min函数的栈

作者:互联网

理解题意

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

可以清楚看到,minStack功能和普通栈基本一致,只不过多了一个O(1)求最小值的Min()函数;

所以容易想到在栈定义时加一个min变量来记录最小值(很像顺序遍历数组求最小值的感觉),但这样会造成一个问题:

IMG_7B2D351CBB5E-1

也可以从下标0开始,也就是第0层的min为-2。

算法实现

代码详情:

关键代码:

func (this *MinStack) Push(x int) {
	if this.stack.Len() == 0 { // 栈中为空,min自然也为空,第一个元素的min就是第一个元素自己;
		this.min[0] = x // 0指的是栈的第一层(下标从0开始;)
	} else { // 栈不空,就与上一层的min比较;
		if x < this.min[this.stack.Len()-1] { // 当前还未入栈元素 < min
			this.min[this.stack.Len()] = x //	说明入栈后min该换人了
		} else {
			this.min[this.stack.Len()] = this.min[this.stack.Len()-1] // 否则 刚才的min还是现在的min
		}
	}
	this.stack.PushBack(x)
}

问题反思

// 问题反思:

// 数组的声明及分配内存空间,如何动态分配,append?

// Push函数的优化;

// 还未发起PR;

标签:minStack,Offer,--,30,Len,min,MinStack,stack
来源: https://www.cnblogs.com/kphang/p/15836969.html