当前位置 博文首页 > weixin_43842888的博客:【左右端点指针】LeetCode - 713. 乘积

    weixin_43842888的博客:【左右端点指针】LeetCode - 713. 乘积

    作者:[db:作者] 时间:2021-09-03 15:10

    题目描述

    题目链接

    在这里插入图片描述

    解法

    分析

    对于每个 right(i),我们需要找到最小的 left(j),满足 从 left 到 right 的数值乘积小于 k 。由于当 left 增加时,这个乘积是单调不增的,因此我们可以使用双指针的方法,单调地移动 left

    算法

    我们使用一重循环枚举 right,同时设置 left 的初始值为 0。在循环的每一步中,表示 right 向右移动了一位,将乘积乘以 nums[right]。当乘积大于等于 k 时我们需要向右移动 left,直到满足乘积小于 k 的条件。在每次移动时,需要将乘积除以 nums[left]。当 left 移动完成后,对于当前的 right,就包含了 right?left+1 个乘积小于 k 的连续子数组。

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

    这题一开始我是固定 left 让 right 动的,但发现在 while 判断时 right 指针要么是溢出,要么是会多走或者少走一步,最后终于妥协换成了上面说的解法,就不用担心动的那个指针有溢出情况了

    cs