我们遍历整个数组 nums,定义两个指针 left 和 right,表示子数组的左右端点,用 res 变量保存符合条件的连续子数组的个数,并且定义 product 变量,表示当前子数组的乘积。 遍历数组中的每一个数,把当前数的值累乘到 product 中,如果 product 大于等于设定的值 k,向左移动左指针 left 并把左端元素除以 product 的值,直到当前区间内所有数的乘积都小于 k 为止。此时,减去左右端点之间的数的个数加一(因为是左开右闭区间),得到符合条件的区间的个数。 最后返回 res 变量的值,即为符合条件的连续子数组的个数。
//1.map解法 方法1. 双指针 funcnumSubarrayProductLessThanK(nums []int, k int)int { count := 0// 记录个数 left := 0// 左边界 for left < len(nums) { sum := 1// 乘积 right := left // 每次重置右边界 for right < len(nums) { sum *= nums[right] // 累乘判断是否小于K if sum < k { count++ right++ } else { break } } left++ // 左边界前进一位 } return count }
方法2. 滑动窗口 funcnumSubarrayProductLessThanK(nums []int, k int)int { if k <= 1 { return0 } left, right, res, product := 0, 0, 0, 1
for right < len(nums) { product *= nums[right] for left <= right && product >= k { product /= nums[left] left++ } res += (right - left + 1) right++ }