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

乘积小于K的子数组

时间:2024-12-22 22:26:41浏览次数:6  
标签:count 小于 product right 乘积 示例 数组 left

在这里插入图片描述
要解决“乘积小于 k 的子数组”问题,可以使用滑动窗口技术。下面是详细的步骤和思路:

  1. 初始化变量

    • 定义两个指针 leftright,都初始化为 0,用于表示窗口的左右边界。
    • 一个 product 变量初始化为 1,用于存储当前窗口内的乘积。
    • 一个 count 变量用于记录符合条件的子数组数目。
  2. 扩展右指针

    • 遍历数组,逐步移动 right 指针,更新 product,将当前 right 指向的元素乘到 product 中。
  3. 收缩左指针

    • product 大于或等于 k 时,移动 left 指针,逐步将窗口左侧元素移出,直到 product 小于 k。同时每次更新 product,通过除以移出的元素。
  4. 计数子数组

    • 如果当前 product 小于 k,那么从 leftright 之间的所有子数组都是有效的。有效的子数组数目为 right - left + 1
  5. 返回结果

    • 遍历完成后,返回 count

代码示例(Python):

def num_subarray_product_less_than_k(nums, k):
    if k <= 1:
        return 0

    count = 0
    product = 1
    left = 0
    
    for right in range(len(nums)):
        product *= nums[right]
        
        while product >= k:
            product /= nums[left]
            left += 1
            
        count += right - left + 1  # Count subarrays ending at right

    return count

# 示例
nums1 = [10, 5, 2, 6]
k1 = 100
print(num_subarray_product_less_than_k(nums1, k1))  # 输出: 8

nums2 = [1, 2, 3]
k2 = 0
print(num_subarray_product_less_than_k(nums2, k2))  # 输出: 0

解释:

  • 在第一个示例中,除了单个元素外,还有多个组合的乘积小于 100,总共的有效子数组数量为 8
  • 第二个示例中,因为乘积不可能小于 0,所以返回 0

通过这种方法,我们可以高效地计算出符合条件的子数组数量。

标签:count,小于,product,right,乘积,示例,数组,left
From: https://blog.csdn.net/weixin_43837522/article/details/144653940

相关文章

  • Golang 从数组创建slice(三个参数)
    测试环境:win64,go版本:1.21.8 IDE:GoLand一般的我们知道,slice本身是不存数据的,是对于底层数组的引用,所以最接近底层的创建slice的方法可以这样写:arr:=[5]int{1,2,3,4,5}sliceInt:=arr[:]sliceInt的底层数据就是arr我这次记录下我平时不太会用到的用三个参数创建,大......
  • 第八章:数组-上
    在编写程序的过程中,经常会遇到使用很多数据量的情况,处理每一个数据量都要有一个相对应的变量,如果每一个变量都要单独进行定义则很繁琐,使用数组就可以解决这种问题。本章致力于使读者掌握一维数组和二维数组的作用,并且能利用所学知识解决一些实际问题;掌握字符数组的使用及......
  • 数据结构——数组
    目录一、数组的基本概念二、数组的地址计算2.1二维数组元素地址2.2三维数组元素的地址2.3n维数组元素的地址三、数组的顺序存储四、矩阵的压缩存储4.1特殊矩阵4.2稀疏矩阵4.2.1 三元组顺序表矩阵运算——矩阵转置方法1:压缩扫描方法2:快速转置 4.2.2 行逻......
  • js数组-实例方法:Array.prototype.entries,Array.prototype.every,Array.prototype.fill
    Array.prototype.entries()entries()方法返回一个新的数组迭代器对象,该对象包含数组中每个索引的键/值对语法entries()返回值一个新的可迭代迭代器对象Array.prototype.myEntries()Array.prototype.myEntries=function(){constnewThis=[]for(leti......
  • 后缀数组
    后缀数组后缀数组(SuffixArray)是一个通过对字符串的所有后缀经过排序后得到的数组。实现记\(sa_i\)表示排名为\(i\)的后缀为\(S[sa_i,n]\),\(rk_i\)表示\(S[i,n]\)的排名。由此可得:\[sa_{rk_i}=rk_{sa_i}=i\]考虑已经将每个串以前\(2^{k-1}\)个字符为关键字排......
  • 78.一维数组和二维数组的排序实现
    因为碰到了一些题目故此来做总结一维数组最常用的冒泡排序:#include<stdio.h>voidsort(intarr[],intn){//外层循环for(inti=0;i<n-1;++i){intflag=1;//假设flag=1就是已经排序好的//内层循环for(intj=0;j<n-1-i;......
  • 写一个方法统计给定数组中重复元素的次数
    在前端开发中,你可以使用JavaScript来编写一个方法,用于统计给定数组中重复元素的次数。以下是一个简单的示例:functioncountDuplicates(arr){//创建一个空对象,用于存储元素及其出现的次数constelementCount={};//遍历数组,统计每个元素出现的次数arr.forEach((e......
  • 实现一个数组的push方法
    在JavaScript中,数组已经有一个内置的push方法,用于向数组的末尾添加一个或多个元素,并返回新的长度。但是,如果你想自己实现一个类似的函数,以下是一个简单的方式:Array.prototype.myPush=function(...items){for(letitemofitems){this[this.length]=item;......
  • 实现一个数组的pop方法
    在前端开发中,JavaScript是一种常用的编程语言,它内置了对数组的支持,包括pop()方法。pop()方法用于删除并返回数组的最后一个元素。但是,如果你想自己实现一个pop()方法的话,以下是一个简单的示例:functionmyPop(array){//检查数组是否为空if(array.length===0......
  • Golang学习笔记_13——数组
    Golang学习笔记_10——SwitchGolang学习笔记_11——指针Golang学习笔记_12——结构体文章目录数组1.定义2.访问和修改3.多维数组4.计算数组长度5.数组作为函数参数6.遍历7.数组的内存表示源码数组Go语言中的数组是一种具有固定长度、相同类型元素的集......