题目描述 乘积小于K的子数组
给定一个正整数数组 nums。
找出该数组内乘积小于 k 的连续的子数组的个数。
示例
输入: 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的子数组。
解题思路
转自 https://blog.csdn.net/xuxuxuqian1/article/details/81075350
使用滑动窗口的方法,维护一个乘积小于k的窗口,窗口大小等于该窗口内子数组的数量
窗口变动规则:
- 如果当前窗口乘积小于k,记录当前窗口大小,右边界则向右滑动一格,
- 如果乘积大于等于k,先将左边第一格的数除掉,左边窗口向右滑动一格。
代码
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k)
{
if (k <= 1)
return 0;
int count = 0, left = 0 , one = 1;
for (int right = 0; right < nums.size(); right++)
{
one *= nums[right];
while (one >= k)
one /= nums[left++];
count += right - left + 1;
}
return count;
}
};
int main()
{
Solution sol;
vector<int> nums = {10, 5, 2, 6};
int res = sol.numSubarrayProductLessThanK(nums, 100);
cout << res << endl;
return 0;
}