乘积小于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的子数组的更多相关文章

  1. 【python-leetcode713-双指针】乘积小于k的子数组

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

  2. JZ009乘积小于k的子数组

    title: 乘积小于k的子数组 题目描述 题目链接:乘积小于k的子数组.剑指offer009 解题思路 注意: 一开始的乘积k值就是小的,随着右边窗口移动才会不断增大 怎么样的条件才能更新左窗口:当 ...

  3. [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 ...

  4. Java实现 LeetCode 713 乘积小于K的子数组(子集数量+双指针)

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

  5. [LeetCode] Subarray Product Less Than K 子数组乘积小于K

    Your are given an array of positive integers nums. Count and print the number of (contiguous) subarr ...

  6. 560. 和为K的子数组

    Q: A: 1.暴力找所有可能的子数组,n^2个子数组,最长长度n,则n ^3. 2.n^2解法 从1~n-1各起点开始,一直找到结尾,n^2 class Solution { public: int ...

  7. 计蒜客-T1271 完美K倍子数组

    如果一个数组满足长度至少是 22 ,并且其中任意两个不同的元素 A_iAi​ 和 A_j (i \not = j)Aj​(i​=j) 其和 A_i+A_jAi​+Aj​ 都是 KK 的倍数,我们就称 ...

  8. 【LeetCode】560. 和为K的子数组

    560. 和为K的子数组 知识点:数组:前缀和: 题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 输入:nums = [1,1,1], k = 2 ...

  9. Leetcode 560.和为k的子数组

    和为k的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1 ...

  10. LeetCode 560. 和为K的子数组(Subarray Sum Equals K)

    题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] ...

随机推荐

  1. Windows系统的显示器校正

    莫名其妙的显示器显示的内容整体向上偏移,导致一些页面在最大化窗口时,看不见页面的标题,及操作按钮,如页面的关闭,缩小按钮. 解决方法:点击显示器下方的menu按钮,找到 设定 选项,再选择 复位 即可 ...

  2. mybatis的自定义类型转化器如何使用

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...

  3. R安装cplexAPI弯路

    最近使用R进行生物信息多组学分析,需要用到cplex,安装走了不少弯路,记录这个过程. 首先需要安装cplex:我的安装如下, 1.下载地址:cplex_studio1263.win-x86-64百度 ...

  4. 小程序调用OCR识别操作的过程,特此记录。

    bu废话,直接记录.(注:我用的是云调用!!!) 对于大家首次使用该操作时,推荐两位大佬的文章,大家完全可以看两位大佬的文章,一步一步来就可以实现. 第一个文章呢,先看这个 https://blog. ...

  5. fetch 小分析

    includes\database\prefetch.inc line 385 public function fetchField($index = 0) { return $this->fe ...

  6. 解析bean封装成BeanDefinition

    默认命名空间 1:parseDefaultElement 从代码中可以了解到默认的命名空间的一节节点主要是4种,import,alias,bean,beans private void parseDe ...

  7. 使用@RequestBody注解接收的实体类中的某些参数为null

    原因 postman调试接口 为null的参数命名不符合"驼峰法",类似实体类A的属性 cEnterpriseId ,这种命名是不规范的 和lombook的@Data注解有关 用p ...

  8. 全国分乡镇第五次人口普查数据shp数据库省市区县街道

    ==名称:全国第五次人口普查任意十个乡镇的乡镇界地图==数据说明:精确到乡镇级别.==数据:面数据,属性列表(乡镇名.乡镇代码,第六次人口普查分乡镇属性数据)==时间:截止2000年12月31日==格 ...

  9. HttpWebResponse 四种accept-encoding解析(gzip, deflate, br,identity)

    HttpWebResponse 四种accept-encoding解析(gzip, deflate, br,identity[默认])            var hwrs = (HttpWebRe ...

  10. go-bindata安装问题

    问题描述使用命令 go get -u github.com/jteeuwen/go-bindata/... 报错: go get -u github.com/go-bindata/go-bindata ...