【python-leetcode713-双指针】乘积小于k的子数组
问题描述:
给定一个正整数数组 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的子数组的更多相关文章
- 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 ...
- 动态规划-子数组乘积小于k的总个数 Subarray Product Less Than K
2018-09-01 23:02:46 问题求解: 问题求解: 最开始的时候,一眼看过去就是一条 dp 嘛,保存每个数字结尾的长度和,最后求和就好,至于长度如何求,本题中需要用滑动窗口来维护. 很好的 ...
- LeetCode——560. 和为K的子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不 ...
随机推荐
- Keystone V3 API Examples
There are few things more useful than a set of examples when starting to work with a new API. Here a ...
- 常用Java静态代码分析工具的分析与比较
给国产静态代码检测工具Pinpoint打Call! 简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了4种现有的主流Java静态代码分析工具 (Checkstyle,FindBugs ...
- oracle的一些简单语法
1.创建主键自增: --创建序列 create sequence seq_tb_user minvalue nomaxvalue start with increment by nocycle --一 ...
- matplotlib 条形图
一.特点 离散数据,数据之间没有直接的关系 二.分类 1.垂直条形图 bar(x, height, width=0.8) # x 为x轴 # height 为y轴 # width 为 条形图的宽度 例 ...
- 编写TypeScript工具类型,你需要知道的知识
什么是工具类型 用 JavaScript 编写中大型程序是离不开 lodash 工具的,而用 TypeScript 编程同样离不开工具类型的帮助,工具类型就是类型版的 lodash .简单的来说,就是 ...
- maven报错:Return code is: 501 , ReasonPhrase:HTTPS Required
今天把一个去年没做完的项目翻出来做时,发现maven无法正常导入依赖.检查了一遍项目配置,没发现有什么问题.而且依赖在本地仓库存在. 随后发现报错:Failed to transfer file:** ...
- .net Core 2.*使用autofac注入
创建项目 1.创建一个.net core 项目 2.创建一个类库 2.1创建interface文件夹 2.2创建Service文件夹 好了给大家看项目目录 对的.我创建了一个IUserService和 ...
- Nito.AsyncEx 这个库
有一个非常聪明的小伙子 (我高度赞扬) 叫 Stephen Cleary ,他写了一个很棒的 Extension 集,共同参与开发的还有 Stephen Toub (他显然是经验丰富的),所以我充分信 ...
- 安全性与收尾工作 运用过滤器进行授权 精通ASP-NET-MVC-5-弗瑞曼
- 绕过路由系统 (Bypassing the Routing System)| 高级路由特性