乘积小于 k 的子数组——滑动窗口

38 阅读1分钟

image.png

连续子数组的个数

代码:

核心代码ans += j - i + 1

  1. prod 存储乘积,i 为乘积数组的左端点,j 为乘积数组的右端点
  2. 第一层 for 循环右端点右移,内存 for 保证乘积小于 k ,且要保证左端点小于右端点
  3. 每次右端点右移后新增的子数组组合,正是 j - i + 1,然后将其加入 ans 即可
func numSubarrayProductLessThanK(nums []int, k int) (ans int) {
    prod, i := 1, 0
    for j, num := range nums {
        prod *= num
        for ; i <= j && prod >= k; i++ {
            prod /= nums[i]
        }
        ans += j - i + 1
    }
    return
}