赞
踩
简要分析,这个题目刚开始确实没想到滑动窗口,只是想到动态规划解法,时间复杂度为O(),代码如下:
- class Solution {
- public int numSubarrayProductLessThanK(int[] nums, int k) {
- int n = nums.length;
- int ans = 0;
- for(int i = 0 ; i < n ; i++)
- {
- int temp = nums[i];
- if(temp >= k)
- continue;
- else
- ans++;
- for(int j = 1 ; j < n -i ; j++)
- {
- temp = temp * nums[i + j];
- if(temp < k)
- {
- ans++;
- }
- else
- break;
- }
- }
- return ans;
- }
- }
简单提交后,效果有点惨:
几乎是马上就要超时的状态。
滑动窗口的解法,因为数组内全部都是大于0的正数,所以随着窗口的扩大,乘积肯定是越来越大的状态,不满足条件时候便缩小窗口,这么一思考,代码的基本逻辑就。
缩小窗口的代码:用ans窗口区间的乘积
- while(i <= j && ans >= k)
- {
- ans /= nums[i];
- i++;
- }
总体代码如下:
- class Solution {
- public int numSubarrayProductLessThanK(int[] nums, int k) {
- int n = nums.length , i = 0;
- int ans = 1;
- int count = 0;
-
- for(int j = 0 ; j < n ; j++)
- {
- ans *= nums[j];
- while(i <= j && ans >= k)
- {
- ans /= nums[i];
- i++;
- }
- count += (j - i + 1);
- }
- return count;
-
- }
- }
时间复杂度只有O(n),
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。