713. 乘积小于K的子数组(JavaScript)

给定一个正整数数组 nums

找出该数组内乘积小于 k 的连续的子数组的个数。

示例 1:

输入: nums = [10,5,2,6], k = 100
输出: 8
解释: 8个乘积小于100的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。
需要注意的是 [10,5,2] 并不是乘积小于100的子数组。

说明:

  • 0 < nums.length <= 50000
  • 0 < nums[i] < 1000
  • 0 <= k < 10^6

思路:

参考了别人的双指针,设置两个指针:left和right。

设置起始值origin=1,因为需要将数相乘,所以起始值为1;

设置计数值count=0;

以right为索引来遍历(从0到nums最末尾)。

每次将right上的值乘以起始值,乘积大于等于k时,需要丢弃left上的元素,并将left左移,直到乘积小于k,累加每次加入新元素后子数组的个数(right-left+1)。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var numSubarrayProductLessThanK = function(nums, k) {
  if (k <= 1) return 0;
  let left = 0,
      origin = 1,
      count = 0;
  for (var right = 0, len = nums.length; right < len; right++) {
    origin = origin * nums[right];
    while (origin >= k) {
      origin /= nums[left];
      left ++;
    }
    count += right - left + 1;
  }
  return count;
};

 

全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务