跳到主要内容

713.乘积小于K的子数组

链接:713.乘积小于K的子数组
难度:Medium
标签:数组、滑动窗口
简介:请找出该数组内乘积小于 k 的连续的子数组的个数。

题解 1 - 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);
}
};

题解 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

  • 编辑时间: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;
}