剑指 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; } }