
思路:
因为这个题会遇到需要遍历子串,所以第一时间想到的应该是滑动窗口。这题的滑动窗口唯一的不同是计算子串的数量,因为和求最大最小子串不一样,这个题要求所有的子串数量,所以需要找规律来获得子串数量。
也就是:以下这个代码行比较难理解,为什么此时对应的就是需要的子串。
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;
}
};
该文章介绍了一种利用滑动窗口算法来解决计算数组中子串乘积小于给定值K的子串数量的方法。在遍历过程中,当子串乘积大于K时,通过缩小窗口来更新乘积,同时累计满足条件的子串数量。关键代码在于计算子串数量的表达式:`right>=left?(right-left+1):0`。
224

被折叠的 条评论
为什么被折叠?



