- 乘积小于 K 的子数组
给你一个整数数组 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
Java代码1:
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
if(k==0){
return 0;
}
int count=0;
for (int i = 0; i < nums.length; i++) {
int sum=1;
for (int j = i; j < nums.length; j++) {
if((sum*=nums[j])<k){
count++;
}else {
break;
}
}
}
return count;
}
}
Java代码2:
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
int n = nums.length, ans = 0;
if (k <= 1) return 0;
for (int i = 0, j = 0, cur = 1; i < n; i++) {
cur *= nums[i];
while (cur >= k) cur /= nums[j++];
ans += i - j + 1;
}
return ans;
}
}
C代码:
int numSubarrayProductLessThanK(int* nums, int numsSize, int k){
/*每次r指针向右移动一位,并且计算sum*nums[r],来计算left到right的所有数的乘积,如果sum>=k,sum/=nums[l],并且将left右移,直到sum<k,此时相对于右指针right就有right-left+1个连续的子数组符合条件,从0到numsSize遍历一遍right即可得到所有的子数组的个数
左指针右移递减,右指针右移递增,因此在right右移之后不会出现漏掉left左边元素的情况,因为对于当前left,最大的right指针就是右移之前的right*/
if(k<=1)
return 0;
int l=0,r=0,sum=1,cnt=0;
for(r=0;r<numsSize;r++){
sum*=nums[r];
while(sum>=k)
sum/=nums[l++];
cnt+=r-l+1;
}
return cnt;
}
作者:KJ.JK
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习