题目:
给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
示例 1:
输入:nums = [10,5,2,6], k = 100
输出:8
解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2],、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。
需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。
思路
滑动窗口:
同样设置两个指针作为窗口的边界值,这个题同样也是一样,固定左指针后,移动右指针,然后计算左右指针指向的值相乘满不满足题目要求,满足就returnnum++。不满足就停止右指针就继续向后找,简单来说就是左指针每动一次,右指针就要遍历左指针后面子数组一次。从而实现找到所有的子数组。
int numSubarrayProductLessThanK(int* nums, int numsSize, int k){
int left=0,right=0;
int returnNum=0;
for(left=0;left<numsSize;left++){
if(nums[left]<k){
returnNum++;
int sum=nums[left];
right=left+1;
while(right<numsSize){
sum*=nums[right];
if(sum<k){
returnNum++;
}else{
break;
}
right++;
}
}
}
return returnNum;
}