专栏持续更新50道算法题,都是大厂高频算法题,建议关注, 一起巧‘背’算法!
文章目录
- 题目
- 解法一 遍历找最小值(不要求时间复杂度情况下)
- 解法二 辅助栈
- 总结
题目
解法一 遍历找最小值(不要求时间复杂度情况下)
此种解法不满足时间复杂度为O(1)的要求,在不要求时间复杂度的情况下,可以使用该方法。我第一次刷的想法是:
- push,pop使用LinkedList的push,pop方法
- 最小值使用Stream流得到最小值
- 栈头元素使用现成的方法
class MinStack {private LinkedList linkedList;public MinStack() {linkedList = new LinkedList<>();}public void push(int x) {linkedList.push(x);}public void pop() {linkedList.pop();}public int top() {return (int)linkedList.getFirst();}public int min() {return (int)linkedList.stream().filter(e -> e!=null).min(Comparator.naturalOrder()).orElse(null);}
}
解法二 辅助栈
由于时间复杂度需要为O(1),那么思路就是要把最小值存起来,获取的时候直接取。这里采用辅助栈,把最小的值放到第二栈的栈顶,使用peek方法取栈顶元素即可。当然这就需要push跟pop方法添加元素时做下处理,在添加时,如果新元素小于辅助栈的栈顶元素,就把新元素压入辅助栈。
Stack类实际开发中不常用,简单介绍下。Stack类是一个基于数组或链表实现的后进先出(LIFO, Last In First Out)数据结构。peek方法是Stack类中定义的一个方法,它的作用是:
- 不删除栈顶元素,而是返回栈顶元素的值。
- 这个操作允许用户查看栈顶的元素,而不会改变栈的状态。也就是说,栈顶元素仍然是栈顶元素,后续的操作如pop才会移除它。
class MinStack {private Stack<Integer> stack1;private Stack<Integer> stack2;public MinStack() {stack1 = new Stack<>();stack2 = new Stack<>();}public void push(int x) {stack1.add(x);if (stack2.isEmpty() || stack2.peek() >= x) {stack2.add(x);}}public void pop() {if (stack1.pop().equals(stack2.peek())) {stack2.pop();}}public int top() {return stack1.peek();}public int min() {return stack2.peek();}
}
总结
与之前的算法题一样,新手刷这道题也是一脸懵逼,可能有些科班出身的都不知道如何计算时间复杂度。我的建议是先记忆一下题解的思路,先把思路记住,自己能按着思路不看题解写出来就够了。然后再去补时间复杂度等算法基础概念。