写在前面

一道很艺术的编程题~做学习记录

题目描述

给定一个正整数数组 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∗1041 <= nums.length <= 3 * 10^41<=nums.length<=3∗104
1<=nums[i]<=10001 <= nums[i] <= 10001<=nums[i]<=1000
0<=k<=1060 <= k <=10^60<=k<=106

解题思路

这道题使用双指针(活动窗口来解答)
双指针(left,rightleft,rightleft,right)分别指向窗口的左右。由于0<=k<=1060 <= k <=10^60<=k<=106,故leftleftleft右移,乘积一定减小,rightrightright右移,乘积一定增大。
首先,我们要明确当right>nums.lengthright>nums.lengthright>nums.length时结束寻找.
left,rightleft,rightleft,right初始值为000。
rightrightright指向的值为最新加入窗口的值
1.如果,rightrightright指向的值大于等于kkk,则不必再相乘,直接右移right,leftright,leftright,left值。乘积置111.
2.如果,rightrightright指向的值小于kkk,则更新乘积。
2.1若乘积小于kkk,则右移rightrightright值,此时以新加入的rightrightright值为结束的区间都是答案举个栗子:nums=[10,5,2,6],k=100nums = [10,5,2,6], k = 100nums=[10,5,2,6],k=100时,当leftleftleft指向555,rightrightright指向666时,乘积为60(<100)60(<100)60(<100),此时,[5],[2],[5,2],[5,2,6],[2,6],[6][5],[2],[5,2],[5,2,6],[2,6],[6][5],[2],[5,2],[5,2,6],[2,6],[6]乘积均小于100,但之前的区间为[5,2][5,2][5,2],以2结尾的区间[2],[5,2]已经j记录到结果中了,同理,区间以5结尾时,记录过[5][5][5];此时,以6结尾的区间[5,2,6],[2,6],[6][5,2,6],[2,6],[6][5,2,6],[2,6],[6]是新增的答案。那么新增的个数如何计算呢,我们可以看到,当区间为[5,2,6][5,2,6][5,2,6]时,left,right分别指向5,65,65,6,而而新增答案以6为结尾,向左边扩增,每次扩增一位,直至区间结束([6],[2,6],[5,2,6][6],[2,6],[5,2,6][6],[2,6],[5,2,6]恰好是区间长度(right−left+1right-left+1right−left+1)))
2.2若乘积大于kkk,则右移leftleftleft值,减小乘积,直至乘积小于kkk值为止。

代码实现

C++

class Solution {
public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {int l = 0;int prod = 1; //存储乘积int res = 0;for(int r = 0; r < nums.size(); r++){if(nums[r]>k){l=r+1;prod=1;continue;}prod *= nums[r];while(prod >= k){prod /= nums[l++];}res += r - l + 1;}return res;}
};

LeetCode 713 乘积小于K的子数组相关推荐

  1. LeetCode 713. 乘积小于 K 的子数组

    713. 乘积小于 K 的子数组 [双指针]s表示前j到i的数字的乘积,当发现乘积大于等于k的时候,就把j向右移动,并且把s除掉个nums[j],这样得到的就是以i结尾的符合要求的数组的最大长度,比这 ...

  2. ⭐算法入门⭐《双指针》中等04 —— LeetCode 713. 乘积小于K的子数组

  3. LeetCode 937. 重新排列日志文件 / 1823. 找出游戏的获胜者(约瑟夫环问题) / 713. 乘积小于 K 的子数组

    937. 重新排列日志文件 2022.5.3 每日一题 题目描述 给你一个日志数组 logs.每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 . 有两种不同类型的日志: 字母日志: ...

  4. 0505|713. 乘积小于 K 的子数组

    0505|713. 乘积小于 K 的子数组 mid 滑动窗口. 求连续子树组的个数,"连续子树组"很强的暗示---使用滑动窗口. 本题只需记录 以每个数字为右边界所形成的有效子数组 ...

  5. 力扣 713. 乘积小于K的子数组

    题目 给定一个正整数数组 nums和整数 k . 请找出该数组内乘积小于 k 的连续的子数组的个数. 示例 输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小 ...

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

    给定一个正整数数组 nums和整数 k . 请找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小 ...

  7. 【713. 乘积小于 K 的子数组】

    leetcode力扣刷题打卡 题目:1. 两数之和 描述:给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目. 解题思路 1.双指针: 2.左 ...

  8. LeetCode 713、乘积小于 K 的子数组

    713.乘积小于 K 的子数组 1)题目描述 给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目. 示例 1: 输入:nums = [10,5 ...

  9. LeetCode713. 乘积小于K的子数组

    LeetCode713. 乘积小于K的子数组 1. 问题描述 2. 思路 经典双指针问题 3. 代码 func numSubarrayProductLessThanK(nums []int, k in ...

最新文章

  1. 代码审查工具 sonarqube 简介
  2. JAVA中用 SQL语句操作小结
  3. 汇编和python-PyAsm-在python中嵌入汇编 | 学步园
  4. SpringBoot整合MyBatis-Plus分页查询
  5. 继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类
  6. 简历准备及面试技巧,你应该知道的一切
  7. mongodb用户管理和服务安装
  8. ceph集群报错:HEALTH_ERR 1 pgs inconsistent; 1 scrub errors
  9. stream流常用方法_Java8-Stream关键知识点
  10. linux shell编程if语句内判断参数
  11. 小D课堂 - 新版本微服务springcloud+Docker教程_6-02 springcloud网关组件zuul
  12. byte转换字符串(string)+字符串转换byte
  13. 活动目录管理中常用的脚本(二)
  14. 8086汇编复习2 - 使用emu8086
  15. 决策树及matlab实现
  16. android图片和文字设计,如何为图片加上精美文字?
  17. 全球票房73亿的《海王》,是怎么炼成的!
  18. iPhone4S、iPod5代、iPad2、iPad3、mini1代完美绕激活工具Sliver发布全新6.0版,支持工厂激活FMI OFF
  19. Linux常见英文翻译
  20. 对公账户:企业银行结算账户

热门文章

  1. 【转载】 P2P(打洞)方案 及webrtc实现
  2. C语言程序设计学习笔记:P5-循环控制
  3. typeScript基础(5)_对象的类型-interfaces接口
  4. 网页制作基础学习——HTML+CSS
  5. python自动化测试教学反思_学习python自动化测试月半总结
  6. JDA人脸检测算法详解
  7. js实现Base64编码解码
  8. AES 加解密以及异常情况处理
  9. 微信公众号简单开发(4)普通消息
  10. watch命令实现Linux监控