LeetCode刷题记录(三十一):乘积小于 K 的子数组

110 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

乘积小于 K 的子数组

image.png

题目解析

题目素材解析

根据本道题的描述,一共提供了两个素材,并且没有什么特殊的概念。

  1. 一个整数数组nums

  2. 一个整数k。

注意:数组nums的长度在1到30000之间。其中的元素在1到1000之间。k值在0到100000之间。

我的解读

本道题的一个预期结果是,获取整数数组中元素自由组合后的乘积,与整数k作比对,小于k的组合数就是预期结果。

从预期结果上来看,可以将本道题分为两大关卡;

其一,整数数组中元素的排列组合。

其二,排列组合的乘积与K对比。

只要是在解题中解决这两个问题,就可以解答成功了。

解题思路

大概解释一下思路。

第一步,当然是先声明一个结果值count。

第二步,开始循环遍历整数数组nums,进行排列组合。

第三步,不盲目的进行排列组合,因为有些组合一定比K大,若是前面的数相乘已经比K大了,也就没有比较的必要了。

第四步,利用双重循环进行组合的排列,并且与K进行对比。

第五步,在比对过程中,如果符合小于K的情况则结果值count加一。

最后得到count结果值并返回。

代码

class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            if(num < k){
                count++;
                int j = 1;
                while (j < nums.length - i){
                    num = num * nums[i + j];
                    if(num < k){
                        count++;
                        j++;
                    }else{
                        break;
                    }
                }
            }
        }
        return count;
    }

}

执行结果

执行时长高了些,有待于优化。

image.png

Java代码本地执行

Java本地可调试代码,请参考github/Ijiran,可通过索引看到相应代码。