问题描述:

给定一个正整数数组 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. 从头学pytorch(十六):VGG NET

    VGG AlexNet在Lenet的基础上增加了几个卷积层,改变了卷积核大小,每一层输出通道数目等,并且取得了很好的效果.但是并没有提出一个简单有效的思路. VGG做到了这一点,提出了可以通过重复使⽤ ...

  2. Flink系列之Time和WaterMark

    当数据进入Flink的时候,数据需要带入相应的时间,根据相应的时间进行处理. 让咱们想象一个场景,有一个队列,分别带着指定的时间,那么处理的时候,需要根据相应的时间进行处理,比如:统计最近五分钟的访问 ...

  3. python如何计算程序(代码块)的运行时间?

    1.引入time模块 2.调用time模块的time()函数 :用来获取当前的时间,返回的单位是秒 # 引入一个time模块, * 表示time模块的所有功能, # 作用: 可以统计程序运行的时间 f ...

  4. NOIP提高组2018试题解析 Day1 T1 铺设道路 P5019

    题目描述 春春是一名道路工程师,负责铺设一条长度为 nn 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 nn 块首尾相连的区域,一开始,第 ii 块区域下陷的深度为 d_idi​  ...

  5. codeforces 上的找两人的幸运天

    Bob and Alice are often participating in various programming competitions. Like many competitive pro ...

  6. Redis 分布式锁的正确实现方式( Java 版 )

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  7. python+opencv中最近出现的一些变化( OpenCV 官方的 Python tutorial目前好像还没有改过来?) 记一次全景图像的拼接

    最近在学习过程中发现opencv有了很多变动, OpenCV 官方的 Python tutorial目前好像还没有改过来,导致大家在学习上面都出现了一些问题,现在做一个小小的罗列,希望对大家有用 做的 ...

  8. Django自定义状态码

    class BaseResponse: def __init__(self): self.code = 1000 self.data = None self.error = None @propert ...

  9. 【强化学习RL】model-free的prediction和control —— MC,TD(λ),SARSA,Q-learning等

    本系列强化学习内容来源自对David Silver课程的学习 课程链接http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Teaching.html 本文介绍了在m ...

  10. Client API Object Model - Execution Context

    1. executionContext. executionContext定义代码在其中执行的上下文. 并且适用在再form或者grid中的event handler. 比如formContext 或 ...