问题描述:

给定一个正整数数组 nums。

找出该数组内乘积小于 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的子数组。

说明::

0 < nums.length <= 50000
0 < nums[i] < 1000
0 <= k < 10^6

解题:

class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
#由于nums是由正整数构成,如果k小于等于1,直接返回0
if k<=1:
return 0
#用于存储结果
res = 0
#从左至右依次遍历数组,i相当于左指针
for i in range(len(nums)):
#如果当前值小于k,结果加1
if nums[i]<k :
res+=1
#r为右指针
r=i+1
#记录当前值
cur=nums[i]
#右指针开始遍历
while r<len(nums):
#左指针的值先乘以右指针的值
cur=cur*nums[r]
#如果当前值小于k,说明这个子数组可以
if cur<k:
#值加1
res+=1
#右指针右移一位
r+=1
else:
#否则说明该子数组不行,退出while循环
break
return res

结果:超出时间限制,也过了74个实例,说明思想是正确的。

为什么超出时间限制,是因为在while循环中计算复杂度太过复杂。

改进之后:

class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
if k<=1:
return 0
#l为左指针
res,l=0,0
#用于相乘
tmp = 1
#获取右指针right和当前值val
for right,val in enumerate(nums):
#先乘以一位
tmp = tmp*val
#当前值大于等于k,说明值太大了,最左边的出去,左指针右移一位
while tmp>=k:
tmp=tmp/nums[l]
l+=1
#否则的话,当前符合的子数组个数为right-l+1
res+=right-l+1
return res

结果:核心就是res+=right-l+1

不好理解举个例子就知道了,比如说[10,5,2,6]。k=100

l=0,r=0,tmp=10,此时数组[10],结果有0-0+1=1个,也就是它自己

i=0,r=1,tmp=50,此时数组[10,5],结果有1-0+1=2个,也就是[10,5]和[5]

i=0,r=2,tmp=100,此时数组[10,5,2],此时不符合题意了,tmp变为50,l+1=1,子数组为[5,2],有2-1+1=2个,也就是[5,2]和[2]

i=1,r=3,tmp=60,此时数组为[5,2,6],结果有3-1+1=3个,也就是[2]、[6]、[5,2,6]

所以总共有:1+2+2+3=8个

公式怎么来的呢?

我们可以这么看:正常情况下

[10]:1种,l=0,r=0

[10,5]:3种,重复计算了[10],剩余2种,l=0,r=1,1-0+1=2

[10,5,2]:6种,重复计算了[10]、[5]、[10,5],剩余3种,l=0,r=2,2-0+1=3

[5,2]:3种,重复计算了[5],剩余2种,i=1,r=2,2-1+1=2

[5,2,6]:6种,重复计算了[5]、[2]、[5,2],剩余3种,i=1,r=3,3-1+1=3种

祛除了重复计算的,正好每一轮是r-l+1。

【python-leetcode713-双指针】乘积小于k的子数组的更多相关文章

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

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

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

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

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

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

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

  5. 560. 和为K的子数组

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

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

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

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

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

  8. 动态规划-子数组乘积小于k的总个数 Subarray Product Less Than K

    2018-09-01 23:02:46 问题求解: 问题求解: 最开始的时候,一眼看过去就是一条 dp 嘛,保存每个数字结尾的长度和,最后求和就好,至于长度如何求,本题中需要用滑动窗口来维护. 很好的 ...

  9. LeetCode——560. 和为K的子数组

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

随机推荐

  1. Winform PPT切换图片效果

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. 图解kubernetes调度器预选设计实现学习

    Scheduler中在进行node选举的时候会首先进行一轮预选流程,即从当前集群中选择一批node节点,本文主要分析k8s在预选流程上一些优秀的筛选设计思想,欢迎大佬们指正 1. 基础设计 1.1 预 ...

  3. .net 解析嵌套JSON

    JSON格式文件如下:我们是要取出msgJsoncontent里面GeneralReportInfo下serviceData中的totalUseValue数据 { ", "mess ...

  4. 使用远程接口库进一步扩展Robot Framework的测试能力

    引言: Robot Framework的四层结构已经极大的提高了它的扩展性.我们可以使用它丰富的扩展库来完成大部分测试工作.可是碰到下面两种情况,仅靠四层结构就不好使了: 1.有些复杂的测试可能跨越多 ...

  5. JVM中的GC算法,JVM参数,垃圾收集器分类

    一.在JVM中什么是垃圾?如何判断一个对象是否可被回收?哪些对象可以作为GC Roots的根 垃圾就是在内存中已经不再被使用到的空间就是垃圾. 1.引用计数法: 内部使用一个计数器,当有对象被引用+1 ...

  6. scala 对一个数组分组操作

    通常我们有一些需求,对一个数组两两进行翻转,通常就涉及到奇数偶数,否则就会出现数组index异常了,所以我们该怎么办呢? 虽然是一个入门级问题,但是我还是觉得这是一个很有意思的题目,因此写了一个对于通 ...

  7. AI——第四次工业革命

    历史上发生了三次工业革命:第一次是以蒸汽机的发明为代表,改变了长久以来的棉纺织业,人类进入"蒸汽时代":第二次是以汽车的发明和电学的发展为代表,人类的活动范围和时长都极大地扩展,人 ...

  8. 记第一场cf比赛(Codeforces915)

    比赛感想 本来21:05开始的比赛,结果记成21:30了...晚了25分钟才开始[捂脸] 这次是Educational Round,所以还比较简单. 前两道题一眼看去模拟+贪心,怕错仔细看了好几遍题, ...

  9. idea实现svn拉分支和合并分支的教程

    原文地址:https://blog.csdn.net/qq_27471405/article/details/78498260 今天测试了一下svn拉分支和合并分支的教程,决定分享给大家 拉分支教程: ...

  10. MCLS Notes

    MainToolbar View Button Click Event handle àMainToolbar.xaml.cs OnConnect() functionàService.Messeng ...