堆栈基础node
堆栈(stack)具备“后进先出”的特性,利用这个特性咱们能够用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果。线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度通常为O(n)。git
相关LeetCode题:github
844. Backspace String Compare 题解spa
1047. Remove All Adjacent Duplicates In String 题解code
735. Asteroid Collision 题解blog
150. Evaluate Reverse Polish Notation 题解递归
堆栈处理嵌套关系element
堆栈还能够用于解决嵌套类问题,例如 LeetCode 856. Score of Parentheses,时间复杂度O(n):
//856. Score of Parentheses int scoreOfParentheses(string S) { stack<int> st; st.push(0); //最终结果 for(char c:S){ if(c=='(') st.push(0); //暂存中间结果 else{ int val=st.top();st.pop(); val=st.top()+max(val*2,1); st.pop(); //更新中间和最终结果 st.push(val); } } return st.top(); }
这类问题的难点在于理解嵌套过程,分析在单个嵌套开始时如何用stack暂存状态、对应嵌套结束时如何更新状态。嵌套问题通常也可使用递归求解,递归解法理解起来比堆栈解法更直观:直至嵌套的中心、层层往外处理。
相关LeetCode题:
856. Score of Parentheses 堆栈题解 递归题解
341. Flatten Nested List Iterator 题解
636. Exclusive Time of Functions 题解
单调栈
形如这样的问题也可用堆栈解决:对一个数组,对每一个元素求大于或小于该元素的下一个数,例如 LeetCode 503. Next Greater Element II:
//503. Next Greater Element II vector<int> nextGreaterElements(vector<int>& nums) { vector<int> res(nums.size(),-1); stack<int> st; for(int i=nums.size()-1;i>=0;i--) st.push(i); for(int i=nums.size()-1;i>=0;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 题解
1063. Number of Valid Subarrays 题解