当前位置: 首页 > news >正文

713. 乘积小于 K 的子数组 滑动窗口

713. 乘积小于 K 的子数组

已解答

中等

相关标签

相关企业

提示

给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 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 的子数组。

示例 2:

输入:nums = [1,2,3], k = 0
输出:0

提示: 

  • 1 <= nums.length <= 3 * 104
  • 1 <= nums[i] <= 1000
  • 0 <= k <= 106

思路:

  1. 遍历列表:

    • 使用 for 循环遍历列表 numsr 依次指向列表中的每个元素。
    • 在每次循环中,将当前 r 指向的元素乘以 s,更新乘积。
  2. 调整窗口:

    • 当 s 大于等于 k 时,说明当前窗口的乘积不满足条件,需要缩小窗口。
    • 通过将 s 除以 l 指向的元素,并将 l 向右移动一位,来缩小窗口。
    • 这个过程一直持续到 s 小于 k 或者 l 与 r 相等。
  3. 计算结果:

    • 如果 s 小于 k,说明当前窗口的乘积满足条件。
    • 此时,以 r 为右边界的满足条件的子数组个数为 r - l + 1,将其加入 ans

当 s(窗口内元素乘积)小于 k 时,以 r 为右边界的满足条件的子数组个数为 r - l + 1,原因如下:

假设当前窗口的左右边界为 l 和 r

  1. 子数组的个数计算方式:

    • 从左边界 l 开始到右边界 r 的连续子数组,其个数可以通过数学方式来计算。
    • 以 l 为起点,长度为 1 的子数组有 1 个,即 nums[l:r+1](这里切片是从 l 到 r,包含 r)。
    • 以 l + 1 为起点,长度为 2 的子数组有 1 个,即 nums[l + 1:r + 1]
    • 以此类推,直到以 r 为起点,长度为 r - l + 1 的子数组有 1 个,即 nums[r:r + 1]
  2. 推导过程:

    • 对于一个长度为 n 的连续区间,它的子数组个数为 1 + 2 + 3 +... + n
    • 根据等差数列求和公式,这个和为 n*(n + 1)/2
    • 在这里,区间长度为 r - l + 1,所以子数组个数就是 (r - l + 1)*((r - l + 1) + 1)/2
    • 化简后得到 (r - l + 1)*(r - l + 2)/2
    • 但实际上,不需要进行这么复杂的计算,因为这里只需要知道子数组的总数,而总数就是从 l 到 r 的连续元素个数,即 r - l + 1

例如,当 l = 1r = 3 时,子数组有 nums[1:4](长度为 3)、nums[2:4](长度为 2)、nums[3:4](长度为 1),一共 3 - 1 + 1 = 3 个。

class Solution(object):def numSubarrayProductLessThanK(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""l=0s=1ans=0for r in range(len(nums)):s*=nums[r]while s>=k and l<r:s/=nums[l]l+=1if s<k:ans+=r-l+1return ans

相关文章:

  • Python Pandas数据处理效率提升指南
  • 【笔记】自动驾驶预测与决策规划_Part4_时空联合规划
  • 【GUI设计】基于Matlab的图像去噪GUI系统(8),matlab实现
  • 构建企业数字化转型的战略基石——TOGAF框架的深度解析
  • 物理学基础精解【26】
  • 录屏+GIF一键生成,2024年费软件大揭秘
  • Kubernetes 中 Pod 和 Node 的关系详解
  • 代码整洁之道 — 1 命名规范
  • C++——有3个学生,每个学生的数据包括:学号、姓名、3门课的成绩,从键盘输入三个学生的数据。要求打印学生三门课的平均分。
  • SpringBoot使用EasyPoi根据模板导出word or pdf
  • 什么是网络准入控制系统?2024年有哪些好用的网络准入控制系统?
  • 2024/10/1 操作系统大题专训之文件
  • SpringBoot实现社区医院数据集成解决方案
  • AWS Network Firewall -NAT网关配置只应许白名单域名出入站
  • 【代码实现】torch实现F.pixel_shuffle和F.pixel_unshuffle
  • 【剑指offer】让抽象问题具体化
  • 2017-08-04 前端日报
  • Flex布局到底解决了什么问题
  • Git的一些常用操作
  • java8 Stream Pipelines 浅析
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • python大佬养成计划----difflib模块
  • Quartz初级教程
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • vue中实现单选
  • 对象引论
  • 仿天猫超市收藏抛物线动画工具库
  • 给github项目添加CI badge
  • 基于axios的vue插件,让http请求更简单
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 算法之不定期更新(一)(2018-04-12)
  • 小试R空间处理新库sf
  • 智能网联汽车信息安全
  • 《天龙八部3D》Unity技术方案揭秘
  • 数据库巡检项
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # linux从入门到精通(三)
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (九十四)函数和二维数组
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (三)SvelteKit教程:layout 文件
  • (小白学Java)Java简介和基本配置
  • (已解决)vscode如何选择python解释器
  • .net 4.0发布后不能正常显示图片问题
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net core Swagger 过滤部分Api
  • .Net Core 中间件验签
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .pyc文件是什么?
  • @在php中起什么作用?