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

LeetCode 分类刷题: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

解析

注意数据范围 nums[i]≥1,所以乘积不可能小于 1。因此,当 k≤1 时,没有这样的子数组,直接返回 0。

由于子数组越长,乘积越大,越不能满足题目要求;反之,子数组越短,乘积越小,越能满足题目要求。有这种性质的题目,可以用滑动窗口解决。

枚举子数组右端点 right,如果发现子数组不满足要求,就缩小窗口,也就是增大左端点 left。

内层循环结束后,[left,right] 这个子数组是满足题目要求的。由于子数组越短,越能满足题目要求,所以除了 [left,right],还有 [left+1,right],[left+2,right],…,[right,right] 都是满足要求的。也就是说,当右端点固定在 right 时,左端点在 left,left+1,left+2,…,right 的所有子数组都是满足要求的,这一共有 right−left+1 个,加到答案中。

--------------------------------------------------------------------------------------------------------------------

作者:灵茶山艾府
链接:https://leetcode.cn/problems/subarray-product-less-than-k/solutions/1959538/xia-biao-zong-suan-cuo-qing-kan-zhe-by-e-jebq/
来源:力扣(LeetCode)

答案

/*** @param {number[]} nums* @param {number} k* @return {number}*/
var numSubarrayProductLessThanK = function(nums, k) {if(k <= 1) return 0;let left = 0, pro = 1, ans = 0;    //初始化滑动窗口左指针,记录乘积和答案的变量for(let right = 0; right < nums.length; right++) {    //右指针,用于扩大窗口pro *= nums[right];    //更新子数组乘积while(pro >= k) {    //不满足乘积严格小于kpro /= nums[left];left++;    //缩小窗口}ans += right - left + 1;    //对于固定的right,有(right-left+1)个合法的左端点}return ans;
};

复杂度分析

时间复杂度:O(n),其中 n 为 nums 的长度。虽然写了个二重循环,但是内层循环中对 left 加一的总执行次数不会超过 n 次,所以总的时间复杂度为 O(n)。
空间复杂度:O(1),仅用到若干额外变量。

作者:灵茶山艾府
链接:https://leetcode.cn/problems/subarray-product-less-than-k/solutions/1959538/xia-biao-zong-suan-cuo-qing-kan-zhe-by-e-jebq/
来源:力扣(LeetCode)。

http://www.dtcms.com/a/323787.html

相关文章:

  • 【Python】常用内置模块
  • SpringCloud详细笔记
  • JavaScript垃圾回收机制
  • 运维学习Day20——MariaDB数据库管理
  • 《 C Primer Plus》
  • 【Linux指南】Vim的全面解析与深度应用
  • 【webPack|Vite】了解常用配置,主要差异
  • 生产工具革命:定制开发开源AI智能名片S2B2C商城小程序重构商业生态的范式研究
  • MyBatis的xml中字符串类型判空与非字符串类型判空处理方式
  • python中re模块详细教程
  • 状态机浅析
  • nginx下lua的实现机制、Lua错误处理、面向对象
  • Flutter 与 Android NDK 集成实战:实现高性能原生功能
  • 结构化记忆、知识图谱与动态遗忘机制在医疗AI中的应用探析(上)
  • 随机向量正交投影定理(Orthogonal Projection Theorem, OPT)_学习笔记
  • LLaMA-Adapter Efficient Fine-tuning of Language Models with Zero-init Attention
  • C++高频知识点(二十)
  • 数据库删除术:逻辑删除 vs 物理删除,选错毁所有
  • Flink提交流程全解析:从模式到实践
  • Java高并发场景下的缓存穿透问题定位与解决方案
  • 计算机网络:子网的起始地址就是默认的网络地址吗?
  • Flink SQL 中的水印机制
  • 26.Scikit-learn实战:机器学习的工具箱
  • Unity笔记(四)——Camera、碰撞检测函数、刚体加力、音频
  • CSDN 五周年创作纪念日(PS:vnjohn)
  • C++设计模式单例模式(饿汉、懒汉模式)
  • 基于 RabbitMQ 死信队列+TTL 实现延迟消息+延迟插件基本使用
  • 检索召回率优化探究五(BGE-M3 混合检索):基于LangChain0.3 集成Milvu2.5 向量数据库构建的智能问答系统
  • 【Matplotlib】中文显示问题
  • Vue3 组件化开发