思路:滑动窗口
- 此题基于一个主要的前提,这是思考的关键。对于符合条件的某个子区间而言,固定住其右边界
right,一共有right - left + 1个子数组满足条件。
[left, right] [left + 1,right] … [left + (right - left), right] 一共 right - left + 1个子数组满足条件
- 而滑动窗口,或者双指针的大前提,就是保证有序性。可以采用滑动窗口的方法,逐个确定以
right为边界的子数组的个数。
代码:
class Solution {public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {if (k == 0 || k == 1) return 0;int count_sub = 0, len_nums = nums.size();if (!len_nums) return 0;int cur_product = 1;for (int left = 0, right = 0; right < len_nums; ++right) {cur_product *= nums[right];while (cur_product >= k) {cur_product /= nums[left++];}// [left, right], [left + 1, right] ... [left + (right - left), right]// 对特定的right而言,有right - left + 1 个子数组符合条件,这是理解的关键count_sub += right - left + 1;}return count_sub;}};
