剑指 Offer II 009. 乘积小于 K 的子数组(713. 乘积小于 K 的子数组)

题目:

 

思路:

【1】滑动窗口的双指针版本

代码展示:

双指针的方式:

//时间4 ms击败100%
//内存47.6 MB击败94.45%
//时间复杂度:O(n),其中 n 是数组 nums 的长度。两个端点 left 和 right 的增加次数都不超过 n。
//空间复杂度:O(1)。
class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        int sum = 1, left = 0, res = 0;
        for (int right = 0; right < nums.length; right++) {
            sum *= nums[right];
            while (left <= right && sum >= k) {
                sum /= nums[left];
                left++;
            }
            //    其实重点在这一部分:如果不理解的话,用双指针会头大
            //    每次右指针位移到一个新位置,应该加上 x 种数组组合:
            //  nums[right]
            //  nums[right-1], nums[right]
            //  nums[right-2], nums[right-1], nums[right]
            //  nums[left], ......, nums[right-2], nums[right-1], nums[right]
            //共有 right - left + 1 种
            res += right - left + 1;
        }
        return res;
    }
}

 

posted @ 2023-03-06 17:18  忧愁的chafry  阅读(12)  评论(0编辑  收藏  举报