元素值大于变化阈值的子数组(very good)
若O(n2)O(n^2)O(n2)枚举每个起始点的子数组,每个子数组中有最小值。而由题意,为了更可能找到满足条件的子数组就固定以该最小值为中心往两侧尽可能多地扩展。因此枚举每个数组元素并假定它是某个子数组中的最小值,求对应子数组的最长长度(单调栈)。
class Solution {
public:
int validSubarraySize(vector<int>& nums, int threshold) {
stack<pair<int,int>> s;
int l[nums.size()],r[nums.size()];
for(int i = 0;i<nums.size();i++)
{
while(!s.empty() && s.top().first >= nums[i]) s.pop();
if(s.empty()) l[i] = -1; else l[i] = s.top().second;
s.push({nums[i],i});
}
while(!s.empty()) s.pop();
for(int i = nums.size() - 1;i>=0;i--)
{
while(!s.empty() && s.top().first >= nums[i]) s.pop();
if(s.empty()) r[i] = nums.size(); else r[i] = s.top().second;
s.push({nums[i],i});
}
int ans = 0;
for(int i = 0;i<nums.size();i++)
{
int k = r[i] - l[i] - 1;
if((double)threshold / (double)k < (double)nums[i]) return k;
}
return -1;
}
};