《剑指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。

算法实现

代码详情:Coding-Interviews/30-包含min函数的栈.go at main · kp-hang/Coding-Interviews (github.com)

关键代码:

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)
}

问题反思

引用类型的变量都需要声明+分配内存;

变量声明的几种方式:

var variable_name  [SIZE]variable_type
var variable_name  []variable_type

分配内存空间:

balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
make([]int, 1000)

Go语言中make和new的用法及区别可以看这里:Golang语法笔记 - Kp-Hang, - 博客园 (cnblogs.com)

这里的数组都是提前确定好长度,有时候不知道长度的时候应该如何处理呢?

func main() {
	var s []int      // 仅声明了变量,未指明数组元素个数;
	s = append(s, 1) // append有扩容的效果,因为s仅仅是变量声明还没给其分配内存空间;
	fmt.Println(s) 	// [1]
}

若将 s = append(s, 1) 替换为 s[0] = 1 则会出现内存越界:panic: runtime error: index out of range [0] with length 0