欢迎关注公众号:
题目描述:
思路分析:
解法一:利用辅助栈
方法一的基本思想是利用两个栈来实现数据的入栈和栈,一个栈保存原始数据,另一个栈保存所有入栈的数据的最小值,这样,查询最小值时只要返回最小值栈的栈顶元素即可。具体实现借用牛客网的答案:
-
首先初始化原始栈stack 和最小值栈stack_min(存储每次跟原栈中元素比较后的最小元素)
-
接下来插入(push) ‘1’这个元素,此时两个栈的变化如下图:
-
然后再插入(push) ‘2’这个元素,此时两个栈又变化如下图
-
接着要获取栈顶元素,如下图:
-
接着再次插入第三个元素 ‘1’,两个栈又发生如下变化
-
最后再次利用top函数获取到栈顶元素就变成了 1,调用min函数则获取最小值依然是 -1。
实现过程整体如下图所示:
实现代码如下所示:
package JavaOffer;
/*
* @project project
* @author liyongping
* @creed: just do it
* @ date 2021/12/15 12:34
* @ version 1.0
*/
import java.util.Stack;
public class JavaOffer30 {
private Stack<Integer> dataStack = new Stack<>();
private Stack<Integer> minStack = new Stack<>();
public static void main(String[] args) {
JavaOffer30 jo30=new JavaOffer30();
jo30.push(1);
jo30.push(2);
jo30.push(3);
jo30.push(4);
System.out.println(jo30.min());
System.out.println(jo30.top());
}
public void push(int node) {
dataStack.push(node);
minStack.push(minStack.isEmpty() ? node : Math.min(minStack.peek(), node));
}
public void pop() {
dataStack.pop();
minStack.pop();
}
public int top() {
return dataStack.peek();
}
public int min() {
return minStack.peek();
}
}
上述代码运行结果如下,返回最小值和栈顶元素:
解法二:暴力算法
由于没有看清题解,以为用一个栈就可以实现在栈中查最小值的算法,min函数遍历栈,取出栈中最小值的元素即可,这种算法破环了栈中数据的完整性,通过弹出栈中元素比较的方法来获取最小值,并不可行,不满足题目复杂度的要求且破坏了站的结构。实现代码如下:
package JavaOffer;/*
* @project project
* @author liyongping
* @creed: just do it
* @ date 2021/12/15 12:34
* @ version 1.0
*/
import java.util.Stack;
public class JavaOffer30 {
Stack<Integer> stack =new Stack <Integer>();
public static void main(String[] args) {
JavaOffer30 jo30=new JavaOffer30();
jo30.push(1);
jo30.push(2);
jo30.push(3);
jo30.push(4);
System.out.println(jo30.min());
}
public void push(int node) {
stack.push(node);
}
public void pop() {
if(!stack.isEmpty()){
stack.pop();
}
}
public int top() {
return stack.peek();
}
public int min() {
int min=stack.pop();
while (!stack.isEmpty()){
if(min>stack.peek()){
min=stack.peek();
stack.pop();
}
}
return min;
}
}
上述代码运行结果为: