Leetcode 713 乘积小于K的子数组

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBMbG9jeXQ,size_19,color_FFFFFF,t_70,g_se,x_16

我们先从数据量来分析,这题的数组长度nums.size()最长有3e4,这说明了用时间复杂度为n平方的算法肯定会爆,最多只能用nlogn的算法才行。

这题我们很容易想到用n平方遍历来写,直接暴力得答案的路肯定是行不通了,这题是连续子数组,我想到用滑动窗口的方法来写,但这题用一周双指针的解法会更加方便。先上代码: 

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

首先先是特判啦,k <= 1 就直接return  0 这没啥好说的。

核心的代码,就是 ans+= i - j  + 1这行代码,先来解释一下为什么i - j + 1的数量是这期间的子数组的数量,然后ans可以直接加上去。

举个例子,拿例1的数据来看,10,5,2,6,k = 100。第一次遍历,10,很明显temp小于k,ans += 1,再继续,5,temp = 50 小于 100,ans += 2,以此类推,我们可以得到结论,如果一个连续数组里的数字的乘积小于k,那么这个数组的子数组都满足于小于k(因为这里面的num[i] 都大于0),我们在遍历一个数组的时候,从一步步进入这个数组到一步步退出这个数组,不断的i - j + 1的统计,是不是就统计了这个数组的所有子数组呢?不妨可以多用几组数组来测试一下,从进入到退出这其中不断的i - j + 1就可以统计完一个连续数组里所有的子数组了,我们只需要不断的滑动这个窗口就好了,缩到最小,放到最大,每个数组元素最多被遍历2次,时间复杂度可以算是。。O(n)?(我不太会算时间复杂度,小白一个),这就是我这题的思路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值