1、题目描述
输入数组(positive)和一个k,求数组中有多少个subarray乘积是小于k的。
2、思路
碰到subarray问题,有几个方案:
1、动归【求连续最大什么的】 2、two pointers【大概都是正的,要达到某一目标k,连续的区间最小】 3、map【有正有负,有目标k】
这里用two pointers。
遍历数组,求前i个数字的乘积,如果大于k,则移动left,直到满足条件,这时候left到i的乘积是小于k的,以i结尾一共有(i-key+1)个subarray。
3、代码
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
if(k<=1) return 0;
int ans = 0;
int mul = 1;
int left = 0;
for(int i=0;i<nums.size();i++){
mul*=nums[i];
while(mul>=k){
mul/=nums[left];
left++;
}
ans+=(i-left+1);
}
return ans;
}