713. 乘积小于 K 的子数组
给你一个整数数组 nums
和一个整数 k
,请你返回子数组内所有元素的乘积严格小于 k
的连续子数组的数目。
示例 1:
1 | 输入:nums = [10,5,2,6], k = 100 |
示例 2:
1 | 输入:nums = [1,2,3], k = 0 |
提示:
1 <= nums.length <= 3 * 104
1 <= nums[i] <= 1000
0 <= k <= 106
题解:
滑动窗口,
- 使用left和right两个指针代表窗口的左右两端
- 计算窗口内所有元素的乘积
- 如果乘积小于k,则right指针右移,继续累乘。记录有效子数组个数
- 如果乘积大于k,则left指针右移,来减少累乘的结果。
- 因为乘积小于k的子数组,所有的子数组都满足答案,所以只需要对于每个右指针,找到其左指针的个数,即只需要计算以right为右边界的有效子数组的个数,为
right - left +1
1 | public int numSubarrayProductLessThanK(int[] nums, int k) { |
- 时间复杂度:O(N),需要遍历整个数组
- 空间复杂度:O(1),只使用到了常数个额外空间。