0
点赞
收藏
分享

微信扫一扫

力扣 713 乘积小于k的子数组

yongxinz 2022-05-05 阅读 73

继续分享一下今天刷力扣的思路~

今天是这么一个题目,这个题目说的是需要你找到所有元素乘积小于k的连续子数组,首先看清题目,他需要我们找到的是一个连续的子数组,但凡不连续的都不行,首先我刚刚拿到这个题目的思路是从第一项开始,首先放一个res数组和一个resList数组,比如第一个小题[10,5,2,6],我想到的是从第一项10开始遍历,那么首先10肯定是最后数组中的其中一个。所以我给resList加上了一个10,接下来10*5=50小于100,那么先把res变成10,5,再给resList,换句话说,从某项开始遍历,如果乘下去一直是小于k的,那么中间的所有连续子数组都是可行的,比如举个例子[10,5,2,6]我把这个k换成110,那么从10开始,10可以,放进去,10*5=50<200可以,放进去,10*5*2=100可以,放进去,但是10*5*2*6等于1200不可以,所以10的已经结束了,那么下一个就是从5开始继续刚刚的思路,贴上我的代码

最后应该返回的是resList.length。而我为了看看我写的对不对所以做了一个输出,但是我这个代码冗余性强,而且超时了没通过emmm

然后我就把res和resList去了,在resList的地方加了个计数器++,算出来是通过的,但是技术含量不高,所以我去看了看评论区的大佬的想法,果然又把我虐了emmm

首先并不是双循环问题,可以变为双指针,还是拿[10,5,2,6]来解释这个例子,可以设置一个左指针就暂且记为l,右指针记为r,从l和r都从0开始,那么刚开始l和r都是0,于是给计数器ret加上r-l+1,至于为什么是r-l+1我稍后解释,接下来就是右指针右移,r+1指向的是5,所以10*5=50<110,那么刚刚加入了10,现在有5的数组应该是[10,5]和5,r指向的是1,l指向的是10,所以是r-l+1,在接下来,r+1,r指向的是2,所以我加上的应该是[10,5,2],[5,2],[2],也是r-l+1,所以我到这里解释一下为什么是r-l+1,因为右移,加上的都是包含右移节点的,这样可以保证不重复,举个简单的例子,如果现在是[3,5,6,8,10],左节点在5,右节点在10,那么应该是[5,6,8,10],[6,8,10],[8,10],[10]可以理解为r-l就是左边节点一人一个,最后加1是加上本身[10]这个点,就是这个意思,那么下面来看看优化以后的代码

在这里,首先sum表示各个数字的相乘。还是拿[10,5,2,6]不过这次的k我们取100来进行分析这个代码。ret表示的是有多少个数组,i是左指针,r是右指针,从10开始,i和j都是0的话,那么就把j-i+1也就是10这个数加进去,接下来j++这样下去,换句话就是说包含10的连续数组有多少,首先是10,其次是10,5,接下来是10,5,2,显然相乘得到的是100,所以除以10,那么除10以后就没有第一个10了。也就是从5开始了,思路大概是这么一个思路了,就先分享给大家了~

举报

相关推荐

0 条评论