题目:

解答:

简单划窗。left和right两个指针指示窗口边界,m为窗口内所有数乘积。

k==0和k==1单独设置,k==0或者k==1时不存在严格小于k的子数组,return 0

遍历右端点,更新m,如果满足m<k则ans++,否则一直弹出左边窗口的数并且m除去弹出的数

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

时间复杂度O(n)

空间复杂度O(1)

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐