首页 > 其他分享 >乘积小于k的子数组

乘积小于k的子数组

时间:2024-02-04 23:12:55浏览次数:26  
标签:小于 窗口 乘积 nums 数组 100

问题描述:给定一个正整数数组 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

/**
* 思路:
* 采用滑动窗口的解法:维护一个数字乘积刚好小于k的滑动窗口窗口,
* 用变量l来记录其左边界的位置,右边界r就是当前遍历到的位置。
* 遍历原数组,用product乘上当前遍历到的数字,
* 然后进行while循环,如果product大于等于k,
* 则滑动窗口的左边界需要向右移动一位,删除最左边的数字,那么少了一个数字,乘积就会改变,
* 所以用product除以最左边的数字,然后左边右移一位,即l自增1。
* 当我们确定了窗口的大小后,就可以统计子数组的个数了,就是窗口的大小。

* 为什么子数组的个数就是窗口的大小?
* 比如[5 2 6]这个窗口,k还是100,右边界刚滑到6这个位置,
* 这个窗口的大小就是包含6的子数组乘积小于k的个数,即[6], [2 6], [5 2 6],正好是3个。
* 所以窗口每次向右增加一个数字,然后左边去掉需要去掉的数字后,
* 窗口的大小就是新的子数组的个数,每次加到结果res中即可。
* 
* 注意:
* 这里要求子集的乘积值必须小于k
*/
class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        if(k<=1){
            return 0;
        }

        int l=0;
        int r=0;
        int res=0;
        //[l..r]表示的是乘积和<k的窗口
        int product=1;
        while(r<nums.length){
            product*=nums[r];
            while(product>=k){
                product/=nums[l];
                l++;
            }
            //r-l+1表示的就是[l...r]窗口的长度
            res+=(r-l+1);
            r++;
        }
        return res;
    }
}

参考:

标签:小于,窗口,乘积,nums,数组,100
From: https://www.cnblogs.com/i9code/p/18007196

相关文章

  • 长度最小的子数组
    问题描述:给定一个含有n个正整数的数组和一个正整数s,找出该数组中满足其和≥s的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回0。示例:输入:s=7,nums=[2,3,1,2,4,3]输出:2解释:子数组[4,3]是该条件下的长度最小的连续子数组。进阶:如果你......
  • js 数组和对象的深拷贝的方法
    数组深拷贝的方法方法一:for循环实现vararr=[1,2,3,4,5]vararr2=copyArr(arr)functioncopyArr(arr){letres=[]for(leti=0;i<arr.length;i++){res.push(arr[i])}returnres} 方法二:slice方法原理也比较好理解,他是将原数......
  • 树状数组
    树状数组总结前言树状数组是数据结构中的一股清流,代码简洁,思路清晰,又好理解qwq。前置芝士lowbit:https://www.cnblogs.com/zhouruoheng/p/18003331简介树状数组是一种基于lowbit的用于维护\(n\)个数前缀和信息的数据结构。支持:快速求前缀和,复杂度为\(O(\log{n})\)。......
  • 寻找两个有序数组的中位数(4)
    4MedianofTwoSortedArrays问题描述:给定两个大小为m和n的有序数组nums1和nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m+n))。你可以假设nums1和nums2不会同时为空。示例1:nums1=[1,3]nums2=[2]则中位数是2.0示例2:n......
  • 两数之和-输出有序数组
    167TwoSumII-Inputarrayissorted问题描述:给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值index1和index2,其中index1必须小于index2。说明:返回的下标值(index1和index2)不是从零开始的。你可以假设每个输入......
  • 合并两个有序数组
    88.合并两个有序数组问题描述:给定两个有序整数数组nums1和nums2,将nums2合并到nums1中,使得num1成为一个有序数组。说明:初始化nums1和nums2的元素数量分别为m和n。你可以假设nums1有足够的空间(空间大小大于或等于m+n)来保存nums2中的元素。示例:输......
  • 获取数组中元素的所有组合方式
    代码/***获取words成员的所有组合方式*@param{(string|number)[]}words*@return{(string|number)[][]}*/functioncombine(words){constlist=[]words.forEach((word,idx)=>{constrestWords=[...words.slice(0,idx),...words.slice(......
  • 「KDOI-03」构造数组
    「KDOI-03」构造数组题目描述你现在有一个长度为\(n\)的数组\(a\)。一开始,所有\(a_i\)均为\(0\)。给出一个同样长度为\(n\)的目标数组\(b\)。求有多少种方案,使得通过若干次以下操作,可以让\(a\)数组变成\(b\)。选出两个不同的下标\(1\leqi<j\leqn\),并将\(a_i\)......
  • 2024-02-03:用go语言,你有 k 个背包。给你一个下标从 0 开始的整数数组 weights, 其中 we
    2024-02-03:用go语言,你有k个背包。给你一个下标从0开始的整数数组weights,其中weights[i]是第i个珠子的重量。同时给你整数k,请你按照如下规则将所有的珠子放进k个背包。没有背包是空的。如果第i个珠子和第j个珠子在同一个背包里,那么下标在i到j之间的所有珠......
  • 数组的中心位置-od-python
    数组的中心位置时间限制:1s空间限制:256MB限定语言:不限题目描述:给你一个整数数组nums,请计算数组的中心位置。数组中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相乘的积。数组第一个元素的左侧积为1,最后一个元素的右侧积为1如果数组有多个中心位置,应该返回......