• leetcode(c++)(单调栈)


    #include <iostream>
    #include <stack>
    #include <vector>
    #include <queue>
    #include <unordered_map>
    #include <string>
    
    using namespace std;
    
    //最小栈
    class MinStack
    {
        public:
        stack<int>st;
        stack<int>minSt;
        void push(int x)
        {
            st.push(x);
            if(minSt.empty() || x <= minSt.top())
            {
                minSt.push(x);
            }
        }
        void pop()
        {
            int top = st.top();
            if(top == minSt.top())
            {
                minSt.pop();
            }
        }
        int top()
        {
            return st.top();
        }
    
        int getMin()
        {
            return minSt.top();
        }
    
    };
    
    //两个栈实现队列
    
    class Myqueue{
        public: 
        stack<int>st;
        stack<int>queue;
        void push(int x)
        {
            st.push(x);
        }
        int top()
        {
            if(queue.empty())
            {
                while(!st.empty())
                {
                    int val = st.top();
                    st.pop();
                    queue.push(val);
                }
            }
            return queue.top();
        }
        int pop()
        {
            top();
            int val = queue.top();
            return val;
        }
        bool empty()
        {
            return queue.empty() && st.empty();
        }
    };
    
    //两个队列实现一个栈
    class MyStack{
        public:  
        queue<int>q1,q2;
        void push(int x)
        {
            if(q1.empty())q1.push(x);
            while(!q2.empty())
            {
                int val = q2.front();
                q2.pop();
                q1.push(val);
            }
            while(!q1.empty())
            {
                int val = q1.front();
                q1.pop();
                q2.push(val);
            }        
        }
        int pop()
        {
            int val = q2.front();
            q2.pop();
        }
        int front()
        {
            return q2.front();
        }
        bool empty()
        {
            return q1.empty() && q2.empty();
        }
    };
    
    class CircleQueue{
        public:
        vector<int>q;
        int front = 0, rear = -1, size = 0;
        CircleQueue(int k)
        {
            q = vector<int>(k);        
        }
        bool isFull()
        {
            return size == q.size();
        }
        bool isEmpty()
        {
            return size == 0;
        }
        int Front()
        {
            return isEmpty() ? -1 :q[front];
        }
        int Rear()
        {
            return isEmpty() ? -1 : q[rear];
        }
    
        bool enqueue(int x)
        {
            if(!isFull())
            {
                rear = (rear + 1) % q.size();
                q[rear] = x;
                ++size;
                return true;
            }
            else
            return false;
        }
        bool dequeu()
        {
            if(!isEmpty())
            {
                front = (front + 1) % q.size();
                --size;
                return true;
            }
            else
            {
                return false;
            }
        }
    };
    
    
    class MyDequeue{
        public:  
        int front = 0, rear = -1, size = 0,capacity = 0;
        vector<int>q;
        MyDequeue(int k)
        {
            q = vector<int>(k);
            capacity = k;
        }
        bool isFull()
        {
            return size == capacity;
        }
        bool isEmpty()
        {
            return size == 0;
        }
        int getFront()
        {
            return isEmpty() ? -1:q[front];
        }
        int getRear()
        {
            return isEmpty() ? -1:q[rear];
        }
        bool insertFirst(int x)
        {
            if(isFull())return false;
            if(--front < 0) front += capacity;
            q[front] = x;
            ++size;
            if(size == 1)rear = front;
            return true;
        }
    
        bool insertLast(int x)
        {
            if(isFull())return false;
            rear = (rear + 1) % capacity;
            q[rear] = x;
            ++size;
            return true;
        }
    
        bool deleteFirst()
        {
            if(isEmpty())return false;
            front  = (front + 1) % capacity;
            --size;
            return true;
        }
    
        bool deleteLast()
        {
            if(isEmpty())return false;
            if(--rear < 0)rear += capacity;
            --size;
            return true;
        }
    
    };
    
    void print(const vector<int>& res)
    {
        for(int num : res)
        {
            cout << num << " ";
        }
        cout << endl;
    }
    //递增栈
    vector<int>nextGreater(const vector<int>& nums)
    {
        int n = nums.size();
        vector<int>res(n);
        stack<int>st;
        for(int i = n - 1; i >= 0; --i)
        {
            while(!st.empty() && nums[i] >= st.top())
            {
                st.pop();        
            }
            res[i] = st.empty() ? -1:st.top();
            st.push(nums[i]);
        }
        return res;
    }
    
    vector<int> nextGreaterElement(const vector<int>& nums1, const vector<int>& nums2)
    {
        unordered_map<int,int>map;
        stack<int>st;
        int n = nums2.size();
        for(int i = n - 1; i >= 0; --i)
        {
            while(!st.empty() && nums2[i] >= st.top())
            {
                st.pop();
            }
            map[nums2[i]] = st.empty() ? -1:st.top();
            st.push(nums2[i]);
        }
        n = nums1.size();
        vector<int>res;
        for(int i = 0 ; i < n; ++i)
        {
            if(map.find(nums1[i]) != map.end())
            {
                res.emplace_back(map[nums1[i]]);
            }
            else
            {
                res.emplace_back(-1);
            }
        }
        return res;
    }
    
    vector<int>nextGreaterElement(const vector<int>& input)
    {
        int n = input.size();
        vector<int>res(n);
        stack<int>st;
        for(int i = 2 * n - 1; i >= 0; --i)
        {
            while(!st.empty() && input[i % n] >= st.top())
            {
                st.pop();
            }
            res[i % n] = st.empty() ? -1 : st.top();
            st.push(input[i % n]);
        }
        return res;
    }
    
    vector<int>dailyTemperatures(const vector<int>& tmp)
    {
        int n = tmp.size();
        vector<int>res(n);
        stack<int>st;
        for(int i = n - 1; i >= 0; --i)
        {
            while(!st.empty() && tmp[i] >= tmp[st.top()])st.pop();
            res[i] = st.empty() ? 0 : st.top() - i;
            st.push(i);
        }
        return res;
    }
    
    string removeDuplicateLetters(string s) {
        
        vector<int> vis(26), num(26);
        for(char c:s)
        {
            ++num[c-'a'];
        }
    
        string res;
        for(char c:s)
        {
            if(!vis[c - 'a'])
            {
                while(!res.empty() && res.back() > c)
                {
                    if(num[res.back() - 'a'] > 0)
                    {
                        vis[res.back() -'a'] = 0;
                        res.pop_back();
                    }
                    else
                    {
                        break;
                    }
                }
                vis[c - 'a'] = 1;
                res.push_back(c);            
            }
           --num[c - 'a'];
        }  
         return res;
    }  
    
    string removeKdigits(string s,int k)
    {
        stack<char>st;
        for(char c:s)
        {
            while(!st.empty() && c < st.top() && k > 0)
            {
                st.pop();
                --k;
            }
            st.push(c);
        }
        while(k-- > 0)st.pop();
        bool zero = false;
        string res = "";
        while(!st.empty())
        {
            char c = st.top();
            st.pop();   
            res.push_back(c);             
        }
        reverse(res.begin(),res.end());
        res = to_string(stoi(res));
        return res;
        
    }
    
    int trap(const vector<int>& height)
    {
        int res = 0;
        int n = height.size();
        vector<int>left(n),right(n);
        left[0] = height[0];
        right[n-1] = height[n-1];
        for(int i = 1; i < n; ++i)
        {
            left[i] = max(height[i],left[i-1]);        
        }
        for(int i = n - 2; i >= 0; --i)
        {
            right[i] = max(height[i],right[i+1]);
        }
        for(int i = 0; i < n; ++i)
        {
            res += min(left[i],right[i]) - height[i];
        }
        return res;
    }
    
    int trapI(const vector<int>& nums)
    {
        stack<int>st;
        int res = 0, n = nums.size();
        for(int i = 0; i < n ;++i)
        {
            while(!st.empty() && nums[i] > nums[st.top()])
            {
                int pre = st.top();
                st.pop();
                if(st.empty())break;
                int minHeight = min(nums[i],nums[st.top()]);
                res += (minHeight - nums[pre]) * ( i - st.top() - 1);
            }
            st.push(i);
        }
        return res;
    }
    
    int largestRectangleArea(const vector<int>& nums)
    {
        stack<int>st;
        int n = nums.size();
        int res = 0;
        for(int i = 0; i < n; ++i)
        {
            while(!st.empty() && nums[i] <= nums[st.top()])
            {
                int pre = st.top();
                st.pop();
                int preHeight = nums[pre];
                int width = i - (st.empty() ? 0 :st.top() + 1);
                res = max(res, preHeight * width);
            }
            st.push(i);
        }
        while(!st.empty())
        {
            int preHieght = nums[st.top()];
            st.pop();
            int width = n - (st.empty() ? 0 : st.top() + 1);
            res = max(res,preHieght * width);
        }
        return res;
    }
    
    int main()
    {
        vector<int>nums{2,1,2,4,3};
        print(nextGreater(nums));
    
        //LeetCode496
        vector<int>nums1 = {4,1,2};
        vector<int>nums2 = {1,3,4,2};
        print(nextGreaterElement(nums1,nums2));
    
        //LeetCode503
        vector<int>input{1,2,1};
        print(nextGreaterElement(input));
        
        //LeetCode739
        vector<int>tmp{73,74,75,71,69,72,76,73};
        print(dailyTemperatures(tmp));
    
        //LeetCode316
        string s = "bcabc";
        cout << removeDuplicateLetters(s) << endl;
    
        //LeetCode402
        s = "10200";    
        int k = 1;
    
        // s = "1433219";
        // k = 3;
        cout << removeKdigits(s,k) << endl;
    
        //LeetCode42
        vector<int>height{4,2,0,3,2,5};
        cout << trap(height) << endl;
        cout << trapI(height) << endl;
    
        //LeetCode84
    
        height = {2,1,5,6,2,3};
        cout << largestRectangleArea(height) << endl;
        return 0;
    }
  • 相关阅读:
    软工实践结对作业第二次
    团队展示
    软件工程结对作业
    软工实践第二次作业
    栈的初步学习
    课程作业四
    作业
    课程作业2
    博客汇总目录
    Mybatis-plus学习笔记,基于springboot
  • 原文地址:https://www.cnblogs.com/fourmi/p/16220969.html
Copyright © 2020-2023  润新知