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
提示
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的子数组相关推荐
- LeetCode 713. 乘积小于 K 的子数组
713. 乘积小于 K 的子数组 [双指针]s表示前j到i的数字的乘积,当发现乘积大于等于k的时候,就把j向右移动,并且把s除掉个nums[j],这样得到的就是以i结尾的符合要求的数组的最大长度,比这 ...
- ⭐算法入门⭐《双指针》中等04 —— LeetCode 713. 乘积小于K的子数组
- LeetCode 937. 重新排列日志文件 / 1823. 找出游戏的获胜者(约瑟夫环问题) / 713. 乘积小于 K 的子数组
937. 重新排列日志文件 2022.5.3 每日一题 题目描述 给你一个日志数组 logs.每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 . 有两种不同类型的日志: 字母日志: ...
- 0505|713. 乘积小于 K 的子数组
0505|713. 乘积小于 K 的子数组 mid 滑动窗口. 求连续子树组的个数,"连续子树组"很强的暗示---使用滑动窗口. 本题只需记录 以每个数字为右边界所形成的有效子数组 ...
- 力扣 713. 乘积小于K的子数组
题目 给定一个正整数数组 nums和整数 k . 请找出该数组内乘积小于 k 的连续的子数组的个数. 示例 输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小 ...
- 713. 乘积小于 K 的子数组
给定一个正整数数组 nums和整数 k . 请找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小 ...
- 【713. 乘积小于 K 的子数组】
leetcode力扣刷题打卡 题目:1. 两数之和 描述:给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目. 解题思路 1.双指针: 2.左 ...
- LeetCode 713、乘积小于 K 的子数组
713.乘积小于 K 的子数组 1)题目描述 给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目. 示例 1: 输入:nums = [10,5 ...
- LeetCode713. 乘积小于K的子数组
LeetCode713. 乘积小于K的子数组 1. 问题描述 2. 思路 经典双指针问题 3. 代码 func numSubarrayProductLessThanK(nums []int, k in ...
最新文章
- 代码审查工具 sonarqube 简介
- JAVA中用 SQL语句操作小结
- 汇编和python-PyAsm-在python中嵌入汇编 | 学步园
- SpringBoot整合MyBatis-Plus分页查询
- 继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类
- 简历准备及面试技巧,你应该知道的一切
- mongodb用户管理和服务安装
- ceph集群报错:HEALTH_ERR 1 pgs inconsistent; 1 scrub errors
- stream流常用方法_Java8-Stream关键知识点
- linux shell编程if语句内判断参数
- 小D课堂 - 新版本微服务springcloud+Docker教程_6-02 springcloud网关组件zuul
- byte转换字符串(string)+字符串转换byte
- 活动目录管理中常用的脚本(二)
- 8086汇编复习2 - 使用emu8086
- 决策树及matlab实现
- android图片和文字设计,如何为图片加上精美文字?
- 全球票房73亿的《海王》,是怎么炼成的!
- iPhone4S、iPod5代、iPad2、iPad3、mini1代完美绕激活工具Sliver发布全新6.0版,支持工厂激活FMI OFF
- Linux常见英文翻译
- 对公账户:企业银行结算账户