leetcode 1063. Number of Valid Subarrays

题目解析:对于每一个元素,右边第一个比它小的元素之前的元素构成的子数组都满足条件,也就是求右边第一个比它小的元素位置pos,将res += pos-i ;可以用单调栈来实现。遍历结束后,对于仍在栈中的元素,res += n - i ;时间复杂度为O(N) , 空间复杂度为O(N);

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

  

posted on 2020-03-29 15:56  景行cmy  阅读(433)  评论(0)    收藏  举报