Subarray Product Less Than K 乘积小于K的子数组

给定一个正整数数组 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

思路:这道题最初的想法是用dp来做,当遍历到第i个下标时,再次遍历j~i的数组(0<=j<=i)的每个字数组,如果累乘的数值大于k就j++,这样每次都求以第i个数字结尾的累乘数字小于k的个数累加起来,但是该方法的时间复杂度是O(n^2),过不了OJ,于是我们尝试改进算法,因为遍历的右边界i一直在增加,如果每次都从j=0开始从头遍历是没有必要的,所以我们记录左边界left,每次只有当累乘和大于等于k才left++,这样left便是记录了上一次节点的左边界,效率更高,可以实现O(n)的复杂度。

参考代码:

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
    if(k==0) return 0;
	int res = 0, prod = 1,left=0;
	for (int i = 0; i < nums.size(); i++) {
		prod *= nums[i];
		while (prod >= k && left<=i) prod /= nums[left++];
		res += (i - left + 1);
	}
	return res;        
    }
};






猜你喜欢

转载自blog.csdn.net/qq_26410101/article/details/81063332