持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
乘积小于 K 的子数组
题目解析
题目素材解析
根据本道题的描述,一共提供了两个素材,并且没有什么特殊的概念。
-
一个整数数组nums
-
一个整数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;
}
}
执行结果
执行时长高了些,有待于优化。
Java代码本地执行
Java本地可调试代码,请参考github/Ijiran,可通过索引看到相应代码。