剑指 Offer II 009. 乘积小于 K 的子数组

剑指 Offer II 009. 乘积小于 K 的子数组_第1张图片
思路:
因为这个题会遇到需要遍历子串,所以第一时间想到的应该是滑动窗口。这题的滑动窗口唯一的不同是计算子串的数量,因为和求最大最小子串不一样,这个题要求所有的子串数量,所以需要找规律来获得子串数量。
也就是:以下这个代码行比较难理解,为什么此时对应的就是需要的子串。

res += right >= left ? right - left + 1 : 0;
class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) 
    {
        int left=0;
        int right = 0;
        int len = nums.size();
        int sum = 1;
        int res = 0;
        for (right;right < len;right++)
        {
            sum *= nums[right];
            while (right >= left && sum >= k)
            {
                sum /= nums[left++];
            }

            res += right >= left ? right - left + 1 : 0;
        }
        return res;
    }
};

你可能感兴趣的:(leetcode,算法,c++)