《剑指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变量来记录最小值(很像顺序遍历数组求最小值的感觉),但这样会造成一个问题:
也可以从下标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