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

该文章介绍了一种利用滑动窗口算法来解决计算数组中子串乘积小于给定值K的子串数量的方法。在遍历过程中,当子串乘积大于K时,通过缩小窗口来更新乘积,同时累计满足条件的子串数量。关键代码在于计算子串数量的表达式:`right>=left?(right-left+1):0`。
摘要由CSDN通过智能技术生成

在这里插入图片描述
思路:
因为这个题会遇到需要遍历子串,所以第一时间想到的应该是滑动窗口。这题的滑动窗口唯一的不同是计算子串的数量,因为和求最大最小子串不一样,这个题要求所有的子串数量,所以需要找规律来获得子串数量。
也就是:以下这个代码行比较难理解,为什么此时对应的就是需要的子串。

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值