LeetCode 713 乘积小于 K 的子数组

LeetCode 713 乘积小于 K 的子数组

🟡 中等

https://leetcode.cn/problems/subarray-product-less-than-k/description/

注意到数组元素都是大于1的, 因此一旦一个子数组的乘积小于了target, 那么其子数组都是满足的。

每层记录的是: 以right 结尾的所有答案数组个数, 会不会少呢? left 到 right 之间满足条件的不一定要以right 结尾, 那些在这个区间内但是不以right结尾的数组会不会被漏掉了呢? 其实不会, 因为所有数组的右侧结束位置都会被遍历一遍, 和最大子数组和的问题相似, 最大子数组和是枚举开始位置, 这里是枚举的结束位置, 一定不会漏掉.

class Solution {

public:

    int numSubarrayProductLessThanK(vector<int>& nums, int k) {

        if(k<=1) return 0;

        //枚举右端点

        int ans = 0;

        int prod = 1;

        int left = 0;

        for(int r = 0;r<nums.size();r++){

            prod *= nums[r];

            while(prod>=k&&r>=left){

                prod /=nums[left];

                left++;

            }

            ans+=r-left+1;

        }

        return ans;

    }

};