滑动窗口系列-Leetcode 713. 乘积小于 K 的子数组

问题描述

给定一个正整数数组 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

解题报告

一个数组的的子数组个数 为以所有元素开头的子数组个数或者以所有元素结尾的所有子数组个数。

  • 移动右指针,更新窗口内的乘积;
  • 如果窗口内的乘积大于等于 k,更新左指针,直到窗口内的乘积小于 k;
  • 移动右指针,更新窗口内的乘积;
  • 只要窗口内的乘积小于 k, 累加 r-l+1

实现代码

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        if (k <= 1) return 0;
        int ans=0,l=0,r=0,tmpDoc=1;
        while(r<nums.size()){
            tmpDoc*=nums[r];
            while(tmpDoc>=k){
                tmpDoc/=nums[l];
                l++;
            }
            ans+=(r-l+1);
            r++;
        }
        return ans;
    }
};

参考资料

[1] Leetcode 713. 乘积小于 K 的子数组

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章