【力扣刷题总结之713. 乘积小于K的子数组】

相关标签


 一、题目要求

 二、题解和代码实现

1.题解

非官方题解,容易理解

2.代码实现

代码如下(示例):

//滑动窗口
class Solution {
     public int numSubarrayProductLessThanK(int[] nums, int k) {
     if (nums == null || k == 0 || k == 1) return 0;
        int n = nums.length;
        int count =0;
        int l =0;//左指针
        int r = 0;//右指针
        int sum= 1;//乘积的结果

        while (r < n){//循环遍历,直到右指针到尾部,说明已经把数组都乘积了一次
            sum *=nums[r];
            while (sum>=k){//说明不符合条件,需要把结果/左指针的值,再把左指针往右移动一位
                sum /= nums[l];
                l++;
            }
            //这里比较难理解,r-l+1求出左右指针的距离,可以得出当前距离有多少个子数组
            count += r-l+1;
            r++;
        }
        return count;
    }
}
//暴力判断破解
class Solution {
     public int numSubarrayProductLessThanK(int[] nums, int k) {
        int n = nums.length;
        int count =0;//记录次数
        for (int i = 0; i < n; i++) {//遍历
            int sum = nums[i];//获取值
            if (sum >=k){//当大与时,不符合条件
                continue;
            }else {//这里说明小于,次数先+1
                count++;
                int j = i+1;//记录i的下一个值
                while (j<n){//循环遍历,直到末尾
                    sum*=nums[j++];//获取值
                    if (sum>=k){//当大于k说明不符合条件,中断循环
                        break;
                    }else {//符合条件,次数+1
                        count++;
                    }
                }
            }
        }
        return count;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值