LeetCode-713. 乘积小于K的子数组

题目描述 乘积小于K的子数组

给定一个正整数数组 nums。
找出该数组内乘积小于 k 的连续的子数组的个数。

示例

输入: nums = [10,5,2,6], k = 100
输出: 8
解释: 8个乘积小于100的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。
需要注意的是 [10,5,2] 并不是乘积小于100的子数组。

解题思路

转自 https://blog.csdn.net/xuxuxuqian1/article/details/81075350
使用滑动窗口的方法,维护一个乘积小于k的窗口,窗口大小等于该窗口内子数组的数量

窗口变动规则:

  • 如果当前窗口乘积小于k,记录当前窗口大小,右边界则向右滑动一格,
  • 如果乘积大于等于k,先将左边第一格的数除掉,左边窗口向右滑动一格。

代码

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k)
    {
        if (k <= 1)
            return 0;
        int count = 0, left = 0 , one = 1;
        for (int right = 0; right < nums.size(); right++)
        {
            one *= nums[right];
            while (one >= k)
                one /= nums[left++];
            count += right - left + 1;
        }
        return count;
    }
};
int main()
{
    Solution sol;
    vector<int> nums = {10, 5, 2, 6};
    int res = sol.numSubarrayProductLessThanK(nums, 100);
    cout << res << endl;
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容