leetcode刷题
713. 乘积小于 K 的子数组
题目
给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
分析
使用双指针,遍历right,当[left:right]的乘积大于等于k时,[left:right]的所有子连续数据皆满足题意(1+right-left) * (right-left) / 2个,但是有一部分[left:last_right](当前left到上一次的right)的子数组被重复算了一次,需要去掉1+point-left) * (point-left) / 2。此时,需要依次挪到left,直至乘积小于k。
重复上述运算直至right到头,最后判断[left:right]是否<k,满足则加入。因为没有触发内部num>k的条件。
代码
public int numSubarrayProductLessThanK(int[] nums, int k) {
if(k==0) return 0;
int left=0;
int right=0;
int point = 0;
int count = 0;
int num = 1;
while (right<nums.length){
num *= nums[right];
if (num>=k){
count += (1+right-left) * (right-left) / 2 - (1+point-left) * (point-left) / 2;
point = right;
while(left<nums.length && num>=k && left<=right){
num /= nums[left];
left++;
}
}
right++;
}
if (num<k)
count += (1+right-left) * (right-left) / 2 - (1+point-left) * (point-left) / 2;
return count;
}
结果
时间超过39%
内存超过80%
这篇博客详细介绍了如何解决LeetCode中的713题,即找到数组中乘积小于K的连续子数组的个数。博主通过双指针法进行分析,当子数组乘积大于等于K时,计算并减去重复部分,逐步更新左边界,直至遍历完整个数组。文章提供了完整的Java代码实现,并分析了时间复杂度和空间复杂度导致的超时和内存超标问题。
1万+

被折叠的 条评论
为什么被折叠?



