思路:
因为这个题会遇到需要遍历子串,所以第一时间想到的应该是滑动窗口。这题的滑动窗口唯一的不同是计算子串的数量,因为和求最大最小子串不一样,这个题要求所有的子串数量,所以需要找规律来获得子串数量。
也就是:以下这个代码行比较难理解,为什么此时对应的就是需要的子串。
res += right >= left ? right - left + 1 : 0;
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k)
{
int left=0;
int right = 0;
int len = nums.size();
int sum = 1;
int res = 0;
for (right;right < len;right++)
{
sum *= nums[right];
while (right >= left && sum >= k)
{
sum /= nums[left++];
}
res += right >= left ? right - left + 1 : 0;
}
return res;
}
};