堆栈基础

堆栈(stack)具有“后进先出”的特性,利用这个特性我们可以用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果。线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度一般为O(n)。

相关LeetCode题:

13. Roman to Integer  题解

20. Valid Parentheses  题解

844. Backspace String Compare  题解

1047. Remove All Adjacent Duplicates In String  题解

735. Asteroid Collision  题解

150. Evaluate Reverse Polish Notation  题解

堆栈处理嵌套关系

堆栈还可以用于解决嵌套类问题,例如 LeetCode 856. Score of Parentheses,时间复杂度O(n):

    //856. Score of Parentheses
int scoreOfParentheses(string S) {
stack<int> st;
st.push(); //最终结果
for(char c:S){
if(c=='(') st.push(); //暂存中间结果
else{
int val=st.top();st.pop();
val=st.top()+max(val*,); st.pop(); //更新中间和最终结果
st.push(val);
}
}
return st.top();
}

这类问题的难点在于理解嵌套过程,分析在单个嵌套开始时如何用stack暂存状态、对应嵌套结束时如何更新状态。嵌套问题一般也可以使用递归求解,递归解法理解起来比堆栈解法更直观:直至嵌套的中心、层层往外处理。

相关LeetCode题:

856. Score of Parentheses  堆栈题解  递归题解

394. Decode String  堆栈题解  递归题解

341. Flatten Nested List Iterator  题解

385. Mini Parser  题解

636. Exclusive Time of Functions  题解

224. Basic Calculator  题解

772. Basic Calculator III  题解

单调栈

形如这样的问题也可用堆栈解决:对一个数组,对每个元素求大于或小于该元素的下一个数,例如 LeetCode 503. Next Greater Element II:

    //503. Next Greater Element II
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> res(nums.size(),-);
stack<int> st;
for(int i=nums.size()-;i>=;i--) st.push(i);
for(int i=nums.size()-;i>=;i--){
while(!st.empty()&&nums[i]>=nums[st.top()]) st.pop();
if(!st.empty()) res[i]=nums[st.top()];
st.push(i);
}
return res;
}

以上堆栈形式叫单调栈(monotone stack),栈内元素单调递增或递减,用其可以实现O(n)时间复杂度求解问题。

相关LeetCode题:

503. Next Greater Element II  题解

739. Daily Temperatures  题解

901. Online Stock Span  题解

1063. Number of Valid Subarrays  题解

1019. Next Greater Node In Linked List  题解

84. Largest Rectangle in Histogram  题解

算法与数据结构基础 - 堆栈(Stack)的更多相关文章

  1. 算法与数据结构基础 - 二叉树(Binary Tree)

    二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...

  2. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

  3. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  4. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  5. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  6. 算法与数据结构基础 - 分治法(Divide and Conquer)

    分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...

  7. 算法与数据结构基础 - 双指针(Two Pointers)

    双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...

  8. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  9. 算法与数据结构基础 - 图(Graph)

    图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...

随机推荐

  1. Visual C# 2010 实现资源管理器

    演练:使用设计器创建带有 ListView 和 TreeView 控件的资源管理器样式的界面 Visual Studio 2010     其他版本     此主题尚未评级 - 评价此主题   Vis ...

  2. 第四十天 阿乐在其中—Android小游戏的飞机(四)加入敌人

    8月9日,晴. "江城如画里,山晓望晴空. 雨水夹明镜.双桥落彩虹. 人烟寒橘柚,秋色老梧桐." 上篇已经让飞机载入子弹和音效及背景音乐,本篇主要加入敌机. 本篇要用到的几个函数解 ...

  3. scipy —— 丰富的子包(io、cluster)

    io,顾名思义,input/output,输入输出接口: 1. io Input and output (scipy.io) - SciPy v0.18.1 Reference Guide wavfi ...

  4. Visifire charts ToolBar

    <charts:Chart x:Name="ChartPat" Theme="Theme2" BorderBrush="Gray" P ...

  5. js 跨域访问 获取验证码图片 获取header 自定义属性

    1.net core web api 后端 /// <summary> /// 图形验证码 /// </summary> [HttpGet] public IActionRes ...

  6. Win8Metro(C#)数字图像处理--2.26图像减法

    原文:Win8Metro(C#)数字图像处理--2.26图像减法  [函数名称] 图像减法函数SubtractionProcess(WriteableBitmap src, WriteableBi ...

  7. 苹果ios用js的Date()出现NaN问题解决办法

    原文:苹果ios用js的Date()出现NaN问题解决办法 ios使用如下方法获得NaN,安卓手机则是正常计算,解决方法是换个这个时间的格式 new Date("2017-04-28 23: ...

  8. SQLServer 事务复制中使用脚本添加某个对象的发布

    原文:SQLServer 事务复制中使用脚本添加某个对象的发布 -- use [发布库] --添加表:创建项目并将其添加到发布中 exec sp_addarticle @publication = N ...

  9. DELPHI编写服务程序总结(在系统服务和桌面程序之间共享内存,在服务中使用COM组件)

    DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...

  10. mencache的使用二

    在这里说的是在C#中的使用,在C#中使用是需要引入驱动的, 可以在网上找,这里推荐一个链接http://sourceforge.net/projects/memcacheddotnet/ 将Memca ...