力扣训练2

496. 下一个更大元素 I

预处理nums2,用一个单调栈来处理nums2。
如果遍历到的值比栈顶大,那么我们直接将栈顶弹出。
如果遍历到的值比栈顶小,那么此时的栈顶元素一定就是我们要找的第一个比遍历值大的数。
然后再用一个哈希表来存放每个nums2中的值的右边第一个大于它的数。
如果栈中有,就直接存,如果没有,就把该遍历元素存为 -1即可。
最后将当前遍历到的数压入栈中即可。
然后我们直接遍历一遍nums1就可以了。

class Solution {

public:

    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {

        unordered_map<int, int> ke;

        stack<int> st; st.push(-1);

        for(int i = nums2.size() - 1; i >= 0; -- i)

        {

            while(st.size()){

                if(st.top() < nums2[i]) st.pop();

                else break;

            }

            if(st.size()) ke[nums2[i]] = st.top();

            else ke[nums2[i]] = -1;

            st.push(nums2[i]);

        }

        for(int i = 0; i < nums1.size(); ++ i)

            nums1[i] = ke[nums1[i]];

        return nums1;

    }

};

856. 括号的分数

如果是嵌套括号,得分要乘二
如果是并列,得分相加
结合前一个括号就能很容易判断,如果 前面是 , 即 , 那毫无疑问是并列的)(()
如果 前面还是 , 即 , 那自然是嵌套的))...))
再将每层的分数叠加到栈顶,最后得分就是题目所求

class Solution {

public:

    int scoreOfParentheses(string s) {

        int ans = 0, pre = ')';

        vector<int> st;

        for (char c: s) {

            if (c == '(') st.push_back(0);

            else {

                int cur = st.back(); st.pop_back();

                if (pre == '(') cur++;

                else cur *= 2;

                if (st.empty()) ans += cur;

                else {

                    st[st.size() - 1] += cur;

                }

            }

            pre = c;

        }

        return ans;

    }

};

739.每日温度

首先我们定义一个堆栈来储存下标(因为这样可以直接计算出天数差),接着只要当前的温度大于栈中最上面的温度就出栈,而当前下标减掉对应温度的下标即是天数差 最后我们将栈中剩余的下标全部赋零,因为他们后面都没有比他们大的温度了

class Solution {

public:

    vector<int> dailyTemperatures(vector<int>& temperatures) {

        int n=temperatures.size();

        stack<int> st;

        st.push(0);

        for(int i=1;i<n;i++){

            while(!st.empty()&&temperatures[i]>temperatures[st.top()]){

                temperatures[(int)st.top()]=i-(st.top());

                st.pop();

            }

            st.push(i);

        }

        while(!st.empty()){

            temperatures[st.top()]=0;

            st.pop();

        }

        return temperatures;

    }

};

20. 有效的括号

先判断字符串长度是否为偶数然后把左括号压入栈中再看右括号能不能适配,如果不能适配或者没有左括号则返回false,遍历结束后如果没有左括号了,返回true。

class Solution {

public:

    bool isValid(string s) {

          int n = s.size();

        if (n % 2 == 1)

        {

            return false;

        }

       map<char, char> pairs =

       {

            {')', '('},

            {']', '['},

            {'}', '{'}

        };

        stack<char> stk;

        for (char ch: s)

        {

            if (pairs.count(ch))

            {

                if (stk.empty() || stk.top() != pairs[ch])

                {

                    return false;

                }

                stk.pop();

            }

            else

            {

                stk.push(ch);

            }

        }

        return stk.empty();

    }

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值