给定一个正整数数组 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
class Solution { public: int numSubarrayProductLessThanK(vector<int>& nums, int k) { int len = nums.size(); if(len == 0){ return 0; } int res = 0; int left = 0, sum = 1; for(int i = 0; i < len; i ++){ sum *= nums[i]; while(sum >= k && left <= i){ sum /= nums[left]; left ++; } // 因为以 j 为尾元素的子数组找到的起始边界 i 与以 j - 1 为尾元素的子数组找到的起始边界 k 有如下关系: // i >= k // 而且由于乘积和数组单调递增, 所以只要 [i, j] 小于 k, 则任意的 t > i && t < j, 必有 [t, j] 小于 k res += i - left + 1; } return res; } };