题目要求
给你一个整数数组 nums
和一个整数 k
,请你返回子数组内所有元素的乘积严格小于 k
的连续子数组的数目。
思路
采用双指针加滑窗思维,因为题目要求是来连续的数组乘积,具有递增性。使用一个for循环i作为右边边界,定义left作为左边界,当乘积和sum大于给定值k时向左滑动left,直到sum值小于k,其中以i为右边界的数组的个数为i-left+1;
示例
开始错误代码:
long long int sum = 1;
int ans = 0;
for (int i = 0; i < nums.size(); i++) {
int left = 0;
sum *= nums[i];
int temp = sum;
while (left <= i && temp >= k) {
temp /= nums[left++];
}
if (temp < k)
ans += i - left + 1;
}
cout << ans;
//中间过程代码块
错误在于没有控制left的值,让他每次从0开始,不仅在浪费时间,而且致使sum的值过大,超出了long long int的范围,导致在判断temp是否大于k的值时出现判断错误。
代码示例:
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
long long int sum=1;
int ans=0;
int left=0;
for(int i=0;i<nums.size();i++){
sum*=nums[i];
while(left<=i&&sum>=k){
sum/=nums[left++];
}
if(sum<k)
ans+=i-left+1;
}
return ans;
}
};