难度中等272收藏分享切换为英文接收动态反馈
给定一个正整数数组 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的子数组。
示例 2:
输入: nums = [1,2,3], k = 0 输出: 0
提示:
1 <= nums.length <= 3 * 104
1 <= nums[i] <= 1000
0 <= k <= 106
-----------------------------分割线------------------------------
思路:滑动窗口,快指针往右扩张,若遇到乘积累计大于k时退出,小于k时,统计计数+1
int numSubarrayProductLessThanK(int* nums, int numsSize, int k){
int i,j;
int sum = 1;
int retcnt = 0;
for(i=0;i<numsSize;i++){
sum = 1;
for(j=i;j<numsSize;j++){
#if 0
//单个元素已经大于k,提前跳出内循环,再乘下去会比k大,没必要
if(nums[j]>=k){
break;
}
#endif
sum *= nums[j];
//提前跳出内循环,再乘下去还会比k大,没必要
if(sum >= k){
break;
}
retcnt++;
}
}
return retcnt;
}
待优化
1. 没有完全用到滑动窗口,慢指针没根据条件挪动
2. 单个元素可加判断条件,大于k时跳出。