713.乘积小于K的子数组
链接:713.乘积小于K的子数组
难度:Medium
标签:数组、滑动窗口
简介:请找出该数组内乘积小于 k 的连续的子数组的个数。
题解 1 - cpp
- 编辑时间:2022-05-05
- 执行用时:76ms
- 内存消耗:9.4MB
- 编程语言:cpp
- 解法介绍:滑动窗口。
int numSubarrayProductLessThanK(int *nums, int numsSize, int k) {
int l = 0, r = 0, sum = 1, ans = 0;
while (l < numsSize) {
while (r < numsSize && sum * nums[r] < k) sum *= nums[r++];
if (l == r) {
l++;
r++;
} else {
ans += r - l;
sum /= nums[l++];
}
}
return ans;
}
题解 2 - cpp
- 编辑时间:2021-12-24
- 执行用时:49ms
- 内存消耗:59.8MB
- 编程语言:cpp
- 解法介绍:双指针。
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
if (k == 0) return 0;
int ans = 0, num = 1, l = 0;
for (int r = 0; r < nums.size(); r++) {
num *= nums[r];
while (l <= r && num >= k) num /= nums[l++];
ans += r - l + 1;
}
return ans;
}
};
题解 3 - cpp
- 编辑时间:2021-12-24
- 执行用时:72ms
- 内存消耗:59.8MB
- 编程语言:cpp
- 解法介绍:双指针。
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
if (k == 0) return 0;
int n = nums.size(), l = 0, r = 0, num = 1, ans = 0;
while (l < n && r <= n) {
while (r < n && num < k) num *= nums[r++];
ans += r - l - (num >= k ? 1 : 0);
num /= nums[l++];
}
return max(ans, 0);
}
};