在准备面试的过程中,我深入研究了《剑指Offer》一书中的众多算法题目,并针对每一道题目总结出了面试中最优的手撕算法解决方案。鉴于这些题目在面试中出现频率较高,我决定分享其中的一道题及其解法,以期对大家有所帮助。今天我们将讨论的是第20题:如何实现一个具有min方法的栈。
题目描述
任务是设计一个栈的数据结构,该栈除了常规的push、pop和top操作外,还需包含一个能够在常数时间O(1)内返回栈中最小元素的min函数。题目保证在栈为空的情况下不会执行pop、min或top操作。
解题思路
此题看似简单,但需要巧妙的设计才能确保min函数的时间复杂度为O(1)。一个直观的解决方案是使用一个额外的变量来跟踪当前栈中的最小值,但在最小值被弹出后,如何快速找到新的最小值则成为关键。
有效的策略是在每次向栈中添加一个新元素时,如果该元素小于当前的最小值,则首先将当前最小值压入栈,然后才是新元素。这样,在弹出操作遇到最小值时,可以通过再次弹出来恢复上一个最小值。这种机制确保了无论何时调用min函数,都能立即返回当前栈中的最小值。
import java.util.Stack;
public class MinStack {
Stack<Integer> dataStack = new Stack<>();
Stack<Integer> minStack = new Stack<>();
public void push(int x) {
dataStack.push(x);
if (minStack.isEmpty() || x <= minStack.peek()) {
minStack.push(x);
}
}
public void pop() {
if (dataStack.peek() == minStack.peek()) {
minStack.pop();
}.pop();
}
public int top() {
return dataStack.peek();
}
public int getMin() {
return minStack.peek();
}
}
值得注意的是,为了更好地模拟面试环境,建议在没有代码补全功能的情况下练习此类题目,例如使用牛客网提供的在线编辑器。这样可以帮助你适应真实的面试场景,提高手写代码的能力。
理解算法不仅是看懂,更重要的是能够独立实现。因此,建议在阅读完解题思路后,尝试自己手动编写代码,检验是否真正掌握了这一技巧。
相关资源推荐
1. 技术学习资源汇总:涵盖前端、后端、Java、大数据、Python等多个领域的学习资料和实战项目。
2. 面试经验分享:从秋招到春招,全面的面试经验和技巧总结。
3. 编程语言入门指南:适合初学者的Python、C++等编程语言学习路径。
欢迎关注我们的微信公众号【技术探索者】,专注于互联网技术分享和技术面试准备,包括但不限于Java、Python、大数据等领域的内容。通过公众号后台回复关键词,可获取更多学习资源和技术文章。