力扣——713. 乘积小于 K 的子数组(Java、C实现百分百击败)
2023-09-14 09:05:31 时间
- 乘积小于 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,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习
相关文章
- Java实现 LeetCode 713 乘积小于K的子数组(子集数量+双指针)
- Java实现 LeetCode 912 排序数组(用数组去代替排序O(N))
- Java实现 LeetCode 629 K个逆序对数组(动态规划+数学)
- Java实现 LeetCode 629 K个逆序对数组(动态规划+数学)
- Java实现 LeetCode 629 K个逆序对数组(动态规划+数学)
- Java实现 LeetCode 523 连续的子数组和(ง •_•)ง
- Java实现 LeetCode 462 最少移动次数使数组元素相等 II
- Java实现 LeetCode 448 找到所有数组中消失的数字
- Java实现 LeetCode 1013 将数组分成和相等的三个部分
- Java实现 LeetCode 330 按要求补齐数组
- Java实现 LeetCode 209 长度最小的子数组
- Java实现 LeetCode 154 寻找旋转排序数组中的最小值 II(二)
- Java实现 LeetCode 108 将有序数组转换为二叉搜索树
- Java实现 LeetCode 88 合并两个有序数组
- java实现第六届蓝桥杯九数组分数
- Java实现最大连续乘积子数组
- Java实现 蓝桥杯 算法训练 动态数组使用
- Java实现 蓝桥杯 算法训练 寻找数组中最大值
- Scala数组:使用()代替java的[]
- Java数组对象的内存布局
- Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类
- 力扣——26. 删除有序数组中的重复项(Java、C、python3实现)