首页 > 编程语言 > 详细

leetcode 713. 乘积小于K的子数组

时间:2021-06-25 22:31:56      阅读:48      评论:0      收藏:0      [点我收藏+]

给定一个正整数数组 nums。

找出该数组内乘积小于 k 的连续的子数组的个数。

示例 1:

输入: 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的子数组。
说明:

0 < nums.length <= 50000
0 < nums[i] < 1000
0 <= k < 10^6

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-product-less-than-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

采用滑动窗口:

1:设置变量来记录符合的个数sum, 当前窗口中的数字的个数count。

2:遍历数组

若是乘积小于k,则增加count 和sum。并且把窗口的右侧继续扩张。

否则,删除窗口左侧的数字,直到乘积小于K,统计count 和sum。

    public int numSubarrayProductLessThanK(int[] nums, int k) {
        if (k == 0) {
            return 0;
        }
        int sum = 0;
        int count = 0;
        int value = 1;
        int length = nums.length;
        int st = 0;
        for (int i = 0; i < length; i++) {
            int num = nums[i];
            value *= num;
            count++;
            if (value < k) {
                sum += count;
            } else {
                while (value >= k) {
                    value /= nums[st++];
                    count--;
                    if (st > i) {
                        break;
                    }
                }
                if (st <= i) {
                    sum += count;
                }

            }
        }
        return sum;
    }

 

leetcode 713. 乘积小于K的子数组

原文:https://www.cnblogs.com/wangzaiguli/p/14931936.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!