剑指 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.
- 方法:
- 辅助栈
根据栈的“先入后出”的特点,只要栈顶元素未被弹出,栈内元素不会发生改变,栈内元素的最小值也不会发生改变。
- 每次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]
- 方法:
- 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)
- 递归
- 先递归遍历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 2023-04-12 23:00 SocialistYouth 阅读(12) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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训练数据并当服务器共享给他人