leetcode 713. 乘积小于K的子数组
给定一个正整数数组 nums。
找出该数组内乘积小于 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的子数组。
说明:
0 < nums.length <= 50000
0 < nums[i] < 1000
0 <= k < 10^6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-product-less-than-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
采用滑动窗口:
1:设置变量来记录符合的个数sum, 当前窗口中的数字的个数count。
2:遍历数组
若是乘积小于k,则增加count 和sum。并且把窗口的右侧继续扩张。
否则,删除窗口左侧的数字,直到乘积小于K,统计count 和sum。
public int numSubarrayProductLessThanK(int[] nums, int k) { if (k == 0) { return 0; } int sum = 0; int count = 0; int value = 1; int length = nums.length; int st = 0; for (int i = 0; i < length; i++) { int num = nums[i]; value *= num; count++; if (value < k) { sum += count; } else { while (value >= k) { value /= nums[st++]; count--; if (st > i) { break; } } if (st <= i) { sum += count; } } } return sum; }