Leetcode 32. 最长有效括号 & Leetcode 1063. 有效子数组的数目

文章目录

  • Leetcode 32. 最长有效括号
    • 问题描述
    • 解题报告
    • 实现代码
  • Leetcode 1063. 有效子数组的数目
    • 问题描述
    • 解题报告
    • 实现代码
  • 总结
  • 参考资料

Leetcode 32. 最长有效括号

问题描述

Leetcode 32. 最长有效括号 & Leetcode 1063. 有效子数组的数目_第1张图片

解题报告

  • 针对 最长有效括号 这道题:
    对于遇到的每个"(",我们将它的下标放入栈中。
    对于遇到的每个 “)”,我们弹出栈顶的元素并将当前元素的下标与弹出元素下标作差,得出当前有效括号字符串的长度

实现代码

  • Leetcode 32. 最长有效括号
class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int>st;
        st.push(-1);
        int size=s.size(),ans=0;
        for(int i=0;i<size;i++){
            if(s[i]=='(')
                st.push(i);
            else if(!st.empty()){
                ans=max(ans,i-st.top()+1);
                st.pop();
            }
        }
        return ans;
    }
};

Leetcode 1063. 有效子数组的数目

问题描述

Leetcode 32. 最长有效括号 & Leetcode 1063. 有效子数组的数目_第2张图片

解题报告

  • 针对 有效子数组的数目 这道题:
    维持一个非严格单调递增栈
    当前元素小于栈顶元素时,以栈顶元素作为起始的子数组必定只有【当前元素和栈顶元素的距离】个;
    此方法最关键的是,我们需要自己添加边界, 长度为n的数组,符合题目条件的数组个数至少为n。

实现代码

class Solution{
  public:
    int validSubarrays(vector<int>&nums){
        nums.push_back(-9999);
        int res=0,n=nums.size();
        stack<int>s;
        for(int i=0;i<n;i++){
            while(!(s.empty()) && nums[s.top()]>nums[i]){
                res+=(i-s.top());
                s.pop();
            }
            s.push(i);
        }
        return res;
    }
};

总结

真两道题均是依托于栈,将元素的下标压入栈中,然后在合适的时候弹出并与栈顶元素相减以获取距离。

参考资料

[1] Leetcode 32. 最长有效括号
[2] Leetcode 1063. 有效子数组的数目

你可能感兴趣的:(leetcode,数据结构)