JZ009:乘积小于k的子数组

📃 题目描述

题目链接:乘积小于k的子数组、剑指offer009

image-20220407134550639

🔔 解题思路

注意:

  • 一开始的乘积k值就是小的,随着右边窗口移动才会不断增大
  • 怎么样的条件才能更新左窗口:当乘积的值 ≥ k的时候,我们就需要更新左窗口,使得值小于k,出来后的值小于k了,我们才可以更新答案
  • 为什么需要left <= right,因为有可能k值为0,写 left <= right 避免k = 0跳不出循环的情况
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        int left = 0, right = 0;
        int window = 1, res = 0;//window是乘积结果(注意一开始是1),res是子数组个数值;

        for (; right < nums.size(); right++) {
            //更新窗口
            window *= nums[right];

            while (window >= k && left <= right) {
                //更新左窗口,更新到值小于k
                window /= nums[left];
                left++;
            }
            //更新答案
            if(window < k) res += right - left + 1;
        }
        return res;
    }

💥 复杂度分析

  • 时间复杂度:o(n)
  • 空间复杂度:O(1)
posted @ 2022-05-07 18:02  D-booker  阅读(41)  评论(0)    收藏  举报