lc2334 元素值大於變化閾值的子陣列

chenfy27發表於2024-03-17

給定陣列nums[n]和整數threshold,找到長度為k的子陣列,滿足子陣列中每個元素都大於threshold/k,返回滿足條件的任意一個k即可,如不存在,返回-1。
1<=n<=1e5; 1<=nums[i],threshold<=1e9

子陣列每個元素都大於t,也就是最小值大於t。對於固定的最小值,顯然子陣列越長越有可能滿足條件,因此考慮每個元素作為最小值的情況,儘可能的往兩邊延伸,判斷是否能成為答案。使用半開半閉區間避免重複統計。

class Solution {
public:
    int validSubarraySize(vector<int>& nums, int threshold) {
        int n = nums.size();
        vector<int> L(n), R(n), s;
        for (int i = 0; i < n; i++) {
            while (!s.empty() && nums[i] <= nums[s.back()])
                s.pop_back();
            L[i] = s.empty() ? -1 : s.back();
            s.push_back(i);
        }
        s.clear();
        for (int i = n-1; i >= 0; i--) {
            while (!s.empty() && nums[i] < nums[s.back()])
                s.pop_back();
            R[i] = s.empty() ? n : s.back();
            s.push_back(i);
        }
        for (int i = 0; i < n; i++) {
            if (1LL * nums[i] * (R[i]-L[i]-1) > threshold)
                return R[i]-L[i]-1;
        }
        return -1;
    }
};

相關文章