剑指 Offer 30. 包含min函数的栈

剑指 Offer 30. 包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.

  • 方法:
  1. 辅助栈

根据栈的“先入后出”的特点,只要栈顶元素未被弹出,栈内元素不会发生改变,栈内元素的最小值也不会发生改变。

  • 每次push操作,更新最小栈,使栈顶元素是当前栈中的最小元素
  • 每次pop操作,将普通栈和最小栈的栈顶元素都弹出
class MinStack {
public:
stack<int> st;
stack<int> min_st;
MinStack() {
min_st.push(INT_MAX);
}
void push(int x) {
st.push(x);
min_st.push(::min(min_st.top(), x));
}
void pop() {
min_st.pop();
st.pop();
}
int top() {
return st.top();
}
int min() {
return min_st.top();
}
};
  • 复杂度分析:

  • 时间复杂度:所有操作时间复杂度均为O(1)

  • 空间复杂度: O(n), n为元素个数

剑指 Offer 06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

输入:head = [1,3,2]
输出:[2,3,1]

  • 方法:
  1. STL 算法reverse() 反转数组
vector<int> reversePrint(ListNode* head) {
vector<int> res;
while(head != nullptr) {
res.emplace_back(head->val);
head = head->next;
}
reverse(res.begin(), res.end());
return res;
}
  • 时间复杂度:O(n), 遍历链表
  • 空间复杂度:O(n)
  1. 递归
  • 先递归遍历next节点,再添加当前节点的值到当前数组
  • 递归结束条件:当前节点cur == nullptr
void dfs(ListNode* head, vector<int>& res) {
if(head == nullptr) return;
dfs(head->next, res);
res.emplace_back(head->val);
}
vector<int> reversePrint(ListNode* head) {
vector<int> res;
dfs(head, res);
return res;
}
  • 时间复杂度:O(n), 遍历链表,递归n次
  • 空间复杂度:O(n)

posted on   SocialistYouth  阅读(12)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人

统计

点击右上角即可分享
微信分享提示