剑指offer 乘积小于K的子数组

力扣题目链接

class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        if(k < 2) return 0;
        int i = 0,j = 0;
        int ans = 0;
        int x = 1;
        while(j < nums.length){
            x *= nums[j];
            //当l=r时就为1了,是小于k的不会越界,此时j-i+1也为0
            while(x >= k) x /= nums[i++];
            //此时保证了x是小于k的,相当于求右边界左边界为l,右边界为r的连续子数组的个数,
            //右边界是不断递增的,又因为是连续,所以满足条件的每种长度的子数组只会有一个
            //且右边界一直在变也就是不会重复
            ans += j-i+1;
            j++;
        }
        return ans;
    }
}

posted @   蹇爱黄  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示