元素值大于变化阈值的子数组(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;
}
};
这篇博客介绍了一种利用单调栈解决寻找元素值大于变化阈值的子数组的算法。通过枚举数组元素并用栈保存最小值,确定子数组的左右边界,从而找到满足条件的最长子数组。这种方法避免了O(n^2)的时间复杂度,提高了效率。
711

被折叠的 条评论
为什么被折叠?



