713. 乘积小于 K 的子数组

103 阅读1分钟

713. 乘积小于 K 的子数组

思路: 连续子数组问题一般用滑窗:

滑窗l,r维护的是 数组 从l+1到r的乘积val

每次r只右移一位,维护val

为了保证val<k,我们需要将l右移,并维护val,直到val<k为止

在完成维护后,假设当前的l,r是满足条件的

那么区间[l+1,r],[l+2,r]...[r,r] 都是符和要求的区间,共r-l个

故ans+=r-l

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        int l=0,r=0;
        int val=1,ans=0;
        for(int i=0;i<nums.size();i++){
            val*=nums[r++];
            while(l<r&&val>=k) val/=nums[l++];
            ans+=r-l;
        }
        return ans;
    }   
};
class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        int l=0,r=0,ans=0,val=1;
        for(int i=0;i<nums.length;i++){
            val*=nums[r++];
            while(l<r&&val>=k) val/=nums[l++];
            ans+=r-l;
        }
        return ans;
    }
}