跟learnjiawa一起每天一道算法编程题,既可以增强对常用API的熟悉能力,也能增强自己的编程能力和解决问题的能力。算法和数据结构,是基础中的基础,更是笔试的重中之重。
- 不积硅步,无以至千里;
- 不积小流,无以成江海。
题目描述
Java版剑指offer编程题第20题–包含min函数的栈: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
我的想法
- 如果仅仅添加一个成员变量用于保存最小元素, 每次压栈时如果压栈元素比当前最小元素更小, 就更新最小元素. 这样如果出栈操作导致当前的最小元素被弹出,就无法获得次最小值。所以我们需要在最小元素弹出后还能得到次小元素, 次小的弹出后, 还要能得到次次小的。
- 很自然的想到用另一个栈来专门最小元素栈. 每次压栈操作时, 如果压栈元素小于等于当前最小元素, 就把这个元素压入最小元素栈;出栈时, 如果弹出的元素和最小元素栈的栈顶元素相等, 就把最小元素的栈顶弹出。
解题方法1
class Minstack{
//创建两个栈
static Stack<Integer> s = new Stack<>();
static Stack<Integer> sMin = new Stack<>();
void push(int value) {
s.push(value);
if(sMin.empty()){
//主栈为空,最小值就是该元素
sMin.push(value);
}else if(value <= sMin.peek()){
//要加入的值小于等于最小栈栈顶元素。
sMin.push(value);
}
}
void pop() {
if(s.peek() == sMin.peek())
//最小栈弹出当前栈顶元素
sMin.pop();
s.pop();
}
int top() {
return s.peek();
}
int min() {
//时间复杂度为O(1)
return sMin.peek();
}
}
代码测试
package com.learnjiawa.jzoffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
/**
* @author learnjiawa
* 2019-12-20-16:47
*/
public class Solution20 {
public static void main(String[] args) {
Minstack stack = new Minstack();
stack.push(3);
System.out.println("当前最小值:"+stack.min());
stack.push(4);
System.out.println("当前最小值:"+stack.min());
stack.push(2);
System.out.println("当前最小值:"+stack.min());
stack.push(3);
System.out.println("当前最小值:"+stack.min());
stack.pop();
System.out.println("当前最小值:"+stack.min());
stack.pop();
System.out.println("当前最小值:"+stack.min());
stack.push(0);
System.out.println("当前最小值:"+stack.min());
}
}
class Minstack{
//创建两个栈
static Stack<Integer> s = new Stack<>();
static Stack<Integer> sMin = new Stack<>();
void push(int value) {
s.push(value);
if(sMin.empty()){
//主栈为空,最小值就是该元素
sMin.push(value);
}else if(value <= sMin.peek()){
//要加入的值小于等于最小栈栈顶元素。
sMin.push(value);
}
}
void pop() {
if(s.peek() == sMin.peek())
//最小栈弹出当前栈顶元素
sMin.pop();
s.pop();
}
int top() {
return s.peek();
}
int min() {
//时间复杂度为O(1)
return sMin.peek();
}
}
代码测试控制台输出结果:
总结
用时间换空间,很自然就能想到的解法,我先开始也是想到了用一个栈来做,但最后发现如果弹出当前最小元素了就会出错,才加上辅助栈。
参考文献
[1]程杰. 大话数据结构. 北京:清华大学出版社, 2011.
更多
对我的文章感兴趣,点个关注是对我最大的支持,持续更新中…
关注微信公众号LearnJava: