题目解析:对于每一个元素,右边第一个比它小的元素之前的元素构成的子数组都满足条件,也就是求右边第一个比它小的元素位置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 ;
}
};
leetcode 1063. Number of Valid Subarrays
原文:https://www.cnblogs.com/mychen06/p/12592729.html