每日一题(2022-05-05)——乘积小于 K 的子数组
数组 2022 每日 05 小于 乘积
2023-06-13 09:18:38 时间
713. 乘积小于 K 的子数组
题目描述:
给你一个整数数组
nums
和一个整数k
,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
题解:
方式1(好理解,但是时间复杂度高):
思路:
subProduct
: 用来存放以num[i]
开头子集的乘积,subProduct = subProduct * nums[j]
与后续元素相乘,如果满足条件,说明当前的子集算一种,继续与nums[j+1]
去相乘,直到j==len(nums)-1
或者出现不满足;如果不满足,直接进行下一轮循环(因为num里都是是大于0的,所以相乘是递增的,后续再乘也不再满足条件);
func numSubarrayProductLessThanK(nums []int, k int) int {
count := 0
for i := 0; i < len(nums); i++ {
subProduct := 1
for j := i; j < len(nums); j++ {
subProduct = subProduct * nums[j]
if subProduct < k {
count++
} else {
break
}
}
}
return count
}
提交结果:
方式2(滑动窗口):
思路:
数组中的数全部为正数,乘法为非递减, 也就是说一段乘积小于k的子数组中,所有的子数组都满足答案。
left
,right
: 当前窗口的左右端点curProduct
: 记录当前窗口的乘积 当curProduct>= k
时,我们考虑将左端点left
右移,同时消除原来左端点元素nums[left]
对curProduct
的贡献,直到curProduct>= k
不再满足,这样我们就可以得到每个右端点nums[right]
的最远左端点nums[left]
,从而得知以nums[right]
为结尾
的合法子数组个数为rigth
-left
+ 1。 如果不理解right-left+1
,见下图,以例1为例子:
func numSubarrayProductLessThanK(nums []int, k int) int {
// left,right: 当前窗口的左右端点
// curProduct: 记录当前窗口的乘积
left, right, curProduct := 0, 0, 1
ans := 0
if k <= 1 {
return 0
}
// 10 5 2 6
for ; right < len(nums); right++ {
curProduct *= nums[right]
// 当 cur >= k 时,我们考虑将左端点 left 右移,
// 同时消除原来左端点元素 nums[left] 对 curProduct 的贡献
for left <= right && curProduct >= k {
curProduct /= nums[left]
left++
}
ans += right - left + 1
}
return ans
}
提交结果:
相关文章
- LeetCode977(有序数组的平方)
- 2022-08-24:给定一个长度为3N的数组,其中最多含有0、1、2三种值, 你可以把任何一个连续区间上的数组,全变成0、1、2中的一种, 目的是让0、1、2
- java打印数组_Java中打印数组的三种方式
- 2022-09-07:给你一个由正整数组成的数组 nums 。 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。 例如,序列 [4,6,16
- C语言数组作为函数参数「建议收藏」
- c语言如何遍历数组,C语言数组遍历
- 2022-11-18:给定一个数组arr,表示连续n天的股价,数组下标表示第几天 指标X:任意两天的股价之和 - 此两天间隔的天数 比如 第3天,价格是10 第
- 数组转对象,对象转数组对不对_对象数组初始化
- 六、数组及其操作《2022 solidity8.+ 版本教程到实战》
- 2022-10-19:一个数组如果满足 : 升降升降升降... 或者 降升降升...都是满足的 给定一个数组, 1,看有几种方法能够剔除一个元素,达成上述的要求
- 给定两个数组,写一个方法来计算它们的交集。
- 2022-10-27:设计一个数据结构,有效地找到给定子数组的 多数元素 。 子数组的 多数元素 是在子数组中出现 threshold 次数或次数以上的元素。
- js中判断数组中是否包含某元素的方法有哪些_js判断数组里面是否包含某个元素
- 集合转数组的方法_数组与集合的区别
- 2022-09-27:给定一个棵树,树上每个节点都有自己的值,记录在数组nums里,比如nums[4] = 10,表示4号点的值
- 2022-10-23:给你一个整数数组 nums 。如果 nums 的一个子集中,所有元素的乘积可以表示为一个或多个 互不相同的
- 2022-10-27:设计一个数据结构,有效地找到给定子数组的 多数元素 。 子数组的 多数元素 是在子数组中出现 thresh
- Javascript-判断是否为数组的5种方法
- 【JAVA冷知识】既然数组是一个类,为什么动态加载不适合数组?如何动态加载一个数组?
- 2022-12-18:给定一个长度为n的二维数组graph,代表一张图,graph[i] = {a,b,c,d} 表示i讨厌(a
- 高频js手写题之实现数组扁平化、深拷贝、总线模式_2023-02-23
- 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析
- 【初级】C语言——数组
- 2022-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等。 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0
- Java学习笔记之五java数组详解编程语言
- 详解Oracle一维数组赋值方式(oracle一维数组赋值)
- 给Javascript数组插入一条记录的代码
- 第4章数据处理-php数组的处理-郑阿奇
- js处理数组重复元素示例代码
- javascript的日期对象、数组对象、二维数组使用说明