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;
}
}