weekly contest 55 第三题 Subarray Product Less Than K

来源:互联网 发布:手机淘宝内部优惠券 编辑:程序博客网 时间:2024/05/17 07:50

题目


Your are given an array of positive integers nums.Count and print the number of (contiguous) subarrays where the product of all the elements in the subarray is less than k.Example 1:Input: nums = [10, 5, 2, 6], k = 100Output: 8Explanation: The 8 subarrays that have product less than 100 are: [10], [5], [2], [6], [10, 5], [5, 2], [2, 6], [5, 2, 6].Note that [10, 5, 2] is not included as the product of 100 is not strictly less than k.

分析


比赛的时候想试试O(N*N)结果过了,后来数据更新了,我又重新写了个O(N)的

记得自己以前总结过 substring , subarray的题目很多时候可以用滑动窗口(子序列不行)

那么我们先来看看比较暴力的方法吧

先看例子

nums = [10, 5, 2, 6], k = 100

我们从左到右每次读到一个就枚举前面可以达到最长的然后 结果加上长度

第一次
10
ans = 1

5,10( 5可以,5,10可以)
ans=1+2

2,5( 2可以,2,5可以)
ans = 1 + 2 + 2

6,2,5( 6可以 , 2,6可以,2,5,6可以)
ans = 1+2 +2 +3 =8

这样做是O(N*N)但是我们或许不需要这么做

我们可以用two poionts + sliding window 来解决这个问题

还是之前的例子

我们定义起点为0

开始

10
ans = 1

10,5
ans = 1+2

10,5,2不可以但是我们直接除10并且起点++


代码


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

时间复杂度
O(N)

空间复杂度
O(N)

原创粉丝点击