乘积小于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] ...
随机推荐
- fetchAll 的小小分析
includes\database\prefetch.inc line 425 $this->defaultFetchStyle: fetch_object int 5protected $de ...
- Rocky linux command-1
在Linux下一切皆文件 everything is file,包括目录也是文件的一种而这些文件被分为七种类型: • -:普通文件 • d: 目录文件 • b: 块设备 • c: 字符设备 • l: ...
- centos6根分区扩容,非lvm
1.关闭虚拟机,删除里面的快照,将磁盘扩容 2.根分区为sda3,开机后输入fdisk /dev/sda,d,3删除sda3,然后n,p,3,w创建sda3,扇区的开始位置要一致 3.growpart ...
- docker镜像原理(一)
在理解什么是docker镜像之前我们需要搞懂虚拟机系统到底是怎么组成的如何实现的,docker中又是如何安装和使用虚拟机系统的,怎样可以高效灵活的切换系统发行版等问题 一.centos7系统长什么样 ...
- Windows 10更新报错 0x8000ffff
Windows 10更新报错 0x8000ffff - Microsoft Community 那么您可用 "Windows 10 覆盖安装" 来修复,可参考以下步伐,连接里有视频 ...
- sap 付费支持 fico付费求助
从事SAP多年,SAP付费求助,fico有偿服务,月结问题 有偿处理,物料分类账异常处理 每次每个问题最少 500 CNY , 有需要的联系 wx :erpworld sap fico 有偿服务
- win10 python mysqlclient 安装问题 已解决
用习惯了Linux 忽然换到win10 超级不习惯 今天下午就一个mysqlclient 安装弄了好长时间 ,最后发现是得改名 真是想爆粗口. 下面直接进入正题: 下载地址 https:/ ...
- python实现自动打卡
自己也百度了一下,然后写的,分为了三个部分,见三段代码 代码:主程序代码 import timefrom selenium import webdriverfrom private_info impo ...
- flex布局的相关注意事项
文献参考地址:https://www.cnblogs.com/qcloud1001/p/9848619.html 重点事项: 弹性容器的属性 作用于交叉轴 align-items :对单行起作用 al ...
- 1247. 交换字符使得字符串相同 (Medium)
问题描述 1247. 交换字符使得字符串相同 (Medium) 有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 "x" 和 "y",你需要通过 ...