先上暴力解法。
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
int cal,count=0;
for(int i=0;i<nums.size();i++)
{ cal=1;
for(int j=i;j<nums.size();j++)
{
if(cal*nums[j]<k)
{count++;cal*=nums[j];}
else
break;
}
}
return count;
}
};
时间复杂度不满足要求。采用双指针法,这个新增加的长度,我也想了好几次,现在也不是很清楚,第一次能想到,新增的相当于左边的长度再加上1,也就是right-left+1;但再去想又陷入了2^(right-left+1),这是子集合,不是子序列,搞糊涂了。
一开始不通过,,实在cal*=nums[right++],先加了1,自然不对。
最后前面>=1没想到,而且还设置过0,蠢啊;
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
if(k<=1)
return 0;
int left=0,right=0,count=0,cal=1;
while(right<nums.size())
{
cal*=nums[right];
while(cal>=k)
cal/=nums[left++];
count+=right-left+1;
right++;
}
/*for(;right<nums.size();i++)
{
cal*=nums[right];
while(cal>=k)
cal/=nums[left++];
count+=right-left+1;
} */
return count;
}
};