问题描述: 给定一个正整数数组 nums 和整数 k,请找出该数组内乘积小于 k 的连续的子数组的个数。 核心思路: 该题仍然是滑动窗口基础应用题,套用模板可以解题: 维护两个指针 i 和 j,其中 i 为窗口左边界,j 为窗口右边界。外部循环步进右边界 j,在循环内部判断当前窗口是否满足条件,只要条件不满足,则移动左边界 i 直到条件满足。【在该题中只要数组内乘积大于等于 k 就需要缩减窗口】在循环的最后,此时窗口是满足条件的(满足数组内乘积小于 k),则根据 i 和 j 更新结果。【更新子数组个数】 关键在于如何更新结果,在当前子数组中,此时左边界为 i,右边界为 j,那么此时需要更新的满足条件的子数组个数为 j-i+1。 举个例子,假设数组为 nums = {10, 5, 2, 6},而滑动窗口为 j = 1, i = 0 时,窗口内数值为 {10, 5},则符合条件的子数组为 j-i+1 = 2 个,分别为 {5} 和 {10, 5},即以 nums[j] = 5 为结尾的满足条件的子数组个数为 2。【注意子数组 {10} 也满足条件,但会在 j = 0 时被发现满足条件并已加入结果中】 代码实现: class Solution { public: int numSubarrayProductLessThanK(vector<int>& nums, int k) { int ans = 0; int m = nums.size(); int i = 0, j = 0; int mul = 1; while(j < m) { mul *= nums[j]; while(i <= j and mul >= k) mul /= nums[i++]; ans += j - i + 1; ++j; } return ans; } };