乘积小于K的子数组
乘积小于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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/subarray-product-less-than-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
我的思路,嗯其实双指针和滑动窗口是差不多的呀,有些时候以滑动窗口理解双指针会更好理解。首先来考虑朴素的做法:使用双重循环遍历所有子数组,计算子数组的乘积是否符合条件。时间复杂度是\(O(n^2)\)。朴素的做法时间复杂度较高的原因在于使用了双重循环,假设外层循环的index为i,内层循环的index为j,每次外层循环时j都会回溯导致时间复杂度较高。那么如何能够使得j不回溯呢?遍历每个一个i开头的子数组并且计算以i开头的子数组符合条件的数目,我们需要找到恰好符合条件的[i,j]使得其乘积恰好小于k,那么以i开头的子数组的数目为j-i+1;当计算i+1开头的子数组数目时并不需要j回溯,将i移除之后[i+1,j]的乘积是必然符合条件的也就是利用了之前的计算结果使得j不需要回溯,只需要将j不断后移,直到找到[i+1,j]使得乘积恰好小于k即可。思路就是这么一个思路,实现上还是有一点细节的,比如nums[i] >= k,那么i开头的子数组都是不可能符合条件的,直接跳过即可;当j == nums.size() -1也就是末尾时,这是i及i往后的所有子数组都是符合条件的,直接计算数目并退出即可。
代码
class Solution {
public:
//朴素做法时间复杂度在于j每次都要回溯
//j不回溯
//遍历每一个i开始的子数组符合条件的数目
//找到恰好没有超出k的[i,j],那么从i开始的子数组数目为j-i+1
//i+1,继续寻找恰好没有超出k的[i+1,j]并计算数目
//j不需要回溯
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
int ans = 0;
int i = 0,j = 0;
int mul = nums[0];
while(i < nums.size())
{
//如果i>=k,那么不可能有i开始的字符串
//直接跳过即可
if(nums[i] >= k)
{
i = i +1;
j = i;
mul = nums[i];
}
//判断从i开始能走多远
while(j < nums.size() && mul < k)
{
j++;
if(j < nums.size()) mul = mul * nums[j];
}
//cout<<i<<" "<<j<<endl;
//如果还是小于k,也就是i以及i往后的所有都是小于k的
//直接计算结果就行
if(mul < k)
{
ans += (j - i) * (j - i +1) / 2;
break;
}
//否则i最远能够到[i,j-1],以i开始的数组有j-i个
else
{
ans += j -i;
mul = mul / nums[i];
i++;
}
}
return ans;
}
};
乘积小于K的子数组的更多相关文章
- 【python-leetcode713-双指针】乘积小于k的子数组
问题描述: 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100输出: 8解释: 8个乘积小于10 ...
- JZ009乘积小于k的子数组
title: 乘积小于k的子数组 题目描述 题目链接:乘积小于k的子数组.剑指offer009 解题思路 注意: 一开始的乘积k值就是小的,随着右边窗口移动才会不断增大 怎么样的条件才能更新左窗口:当 ...
- [Swift]LeetCode713. 乘积小于K的子数组 | Subarray Product Less Than K
Your are given an array of positive integers nums. Count and print the number of (contiguous) subarr ...
- Java实现 LeetCode 713 乘积小于K的子数组(子集数量+双指针)
713. 乘积小于K的子数组 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解 ...
- [LeetCode] Subarray Product Less Than K 子数组乘积小于K
Your are given an array of positive integers nums. Count and print the number of (contiguous) subarr ...
- 560. 和为K的子数组
Q: A: 1.暴力找所有可能的子数组,n^2个子数组,最长长度n,则n ^3. 2.n^2解法 从1~n-1各起点开始,一直找到结尾,n^2 class Solution { public: int ...
- 计蒜客-T1271 完美K倍子数组
如果一个数组满足长度至少是 22 ,并且其中任意两个不同的元素 A_iAi 和 A_j (i \not = j)Aj(i=j) 其和 A_i+A_jAi+Aj 都是 KK 的倍数,我们就称 ...
- 【LeetCode】560. 和为K的子数组
560. 和为K的子数组 知识点:数组:前缀和: 题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 输入:nums = [1,1,1], k = 2 ...
- Leetcode 560.和为k的子数组
和为k的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1 ...
- LeetCode 560. 和为K的子数组(Subarray Sum Equals K)
题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] ...
随机推荐
- Windows系统的显示器校正
莫名其妙的显示器显示的内容整体向上偏移,导致一些页面在最大化窗口时,看不见页面的标题,及操作按钮,如页面的关闭,缩小按钮. 解决方法:点击显示器下方的menu按钮,找到 设定 选项,再选择 复位 即可 ...
- mybatis的自定义类型转化器如何使用
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...
- R安装cplexAPI弯路
最近使用R进行生物信息多组学分析,需要用到cplex,安装走了不少弯路,记录这个过程. 首先需要安装cplex:我的安装如下, 1.下载地址:cplex_studio1263.win-x86-64百度 ...
- 小程序调用OCR识别操作的过程,特此记录。
bu废话,直接记录.(注:我用的是云调用!!!) 对于大家首次使用该操作时,推荐两位大佬的文章,大家完全可以看两位大佬的文章,一步一步来就可以实现. 第一个文章呢,先看这个 https://blog. ...
- fetch 小分析
includes\database\prefetch.inc line 385 public function fetchField($index = 0) { return $this->fe ...
- 解析bean封装成BeanDefinition
默认命名空间 1:parseDefaultElement 从代码中可以了解到默认的命名空间的一节节点主要是4种,import,alias,bean,beans private void parseDe ...
- 使用@RequestBody注解接收的实体类中的某些参数为null
原因 postman调试接口 为null的参数命名不符合"驼峰法",类似实体类A的属性 cEnterpriseId ,这种命名是不规范的 和lombook的@Data注解有关 用p ...
- 全国分乡镇第五次人口普查数据shp数据库省市区县街道
==名称:全国第五次人口普查任意十个乡镇的乡镇界地图==数据说明:精确到乡镇级别.==数据:面数据,属性列表(乡镇名.乡镇代码,第六次人口普查分乡镇属性数据)==时间:截止2000年12月31日==格 ...
- HttpWebResponse 四种accept-encoding解析(gzip, deflate, br,identity)
HttpWebResponse 四种accept-encoding解析(gzip, deflate, br,identity[默认]) var hwrs = (HttpWebRe ...
- go-bindata安装问题
问题描述使用命令 go get -u github.com/jteeuwen/go-bindata/... 报错: go get -u github.com/go-bindata/go-bindata ...