题意

给定一个正整数数组和K,数有多少个连续子数组满足:

数组中所有的元素的积小于K.

思路

依旧是双指针的思路

我们首先固定右指针r.

现在子数组的最右边的元素是nums[r].

我们让这个子数组尽可能的长,尽可能的往左边拓展,假设最左边的元素的前一个元素是l.

即子数组(l,r].

显然对于以nums[r]结尾的满足题意的数组个数为r−lr-lr−l

对于

(l1,r1],&ThickSpace;(l2,r2](r1&lt;r2)(l_1,r_1],\;(l_2,r_2] \quad (r_1&lt;r_2)(l1​,r1​],(l2​,r2​](r1​<r2​)

由于数组元素都是正数,易证

l1&lt;l2l_1 &lt; l_2l1​<l2​

举个例子(其实证明也是这个反正的思路):

加入(2,5]和(1,6]同时存在。

  1. (2,5] 第5个数结尾,左边最多到第2个。 ①
  2. (1,6] 第6个数结尾,左边最多到第1个。

    那么换句话第一个数到第五个数的乘积肯定不超过k,那和①这一行的(2,5]矛盾了。

    因此l关于r是非严格单调递增(换句话说不下降)的。

    明白了这一点就可以具体的设计了。

由r快速转移到r+1的状态

假设对于r我们已经求得了(l,r]。

那么对于r+1的问题,我们如何快速转移求解呢?

  1. 更新product,乘以新增的nums[r]
  2. 基于单调性,我们只需从上一步r的l开始验证,如果不符合则l后移

复杂度

T(N)=O(N),M(N)=O(1)T(N)=O(N),M(N)=O(1)T(N)=O(N),M(N)=O(1)

结果

(14ms, 80.5%, 52.7MB, 100.00%)

Source Code

class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
int len = nums.length;
int product = 1;
int count = 0;
// (l,r]
int l = -1, r = 0;
while (r < len) {
product *= nums[r];
while (l < r && product >= k)
product /= nums[++l];
count += r - l;
++r;
}
return count;
}
}

参考链接

有了思路之后,还参考了GrandYang的博客

LeetCode Subarray Product Less Than K 题解 双指针+单调性的更多相关文章

  1. LeetCode Subarray Product Less Than K

    原题链接在这里:https://leetcode.com/problems/subarray-product-less-than-k/description/ 题目: Your are given a ...

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

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

  3. Subarray Product Less Than K LT713

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

  4. 【LeetCode】713. Subarray Product Less Than K 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/subarray ...

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

  6. 713. Subarray Product Less Than K

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

  7. leetcode713 Subarray Product Less Than K

    """ Your are given an array of positive integers nums. Count and print the number of ...

  8. Subarray Product Less Than K

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

  9. [leetcode] 713. Subarray Product Less Than K

    题目 Given an array of integers nums and an integer k, return the number of contiguous subarrays where ...

随机推荐

  1. centos7.5下yum安装mysql-5.6.43

    cd ~/ && cat /etc/redhat-release yum list installed |grep mysql #<===查看是否安装mysql,如果已经安装,使 ...

  2. 【转载】Python 最强编辑器PyCharm详细使用指南!

    PyCharm 是一种 Python IDE,可以帮助程序员节约时间,提高生产效率.那么具体如何使用呢?本文从 PyCharm 安装到插件.外部工具.专业版功能等进行了一一介绍,希望能够帮助到大家.机 ...

  3. 2,简单的Python爬虫

    前言 根据上一篇 1,Python爬虫环境的安装我们已经在本地安装好了Python环境,那么这一篇就开始学习如何用Python来爬虫! 环境:操作系统:Windows10 IDE:   PyCharm ...

  4. K8s~为pod添加sidecar进行日志收集

    我们在k8s部署服务时,一般来说一个服务会对应一类pod,而pod通过rs实现副本集,而这些pod的日志一般有控制台stdout和文件的,一般会把这些日志最终输出到elasticsearch里,再通过 ...

  5. SparkShuffle机制

    在早期版本的Spark中,shuffle过程没有磁盘读写操作,是纯内存操作,后来发现效率较低,且极易引发OOME,较新版本的Shuffle操作都加入了磁盘读写进行了改进. 1.未经优化的HashShu ...

  6. mysql必知必会--用通配符进行过滤

    LIKE 操作符 前面介绍的所有操作符都是针对已知值进行过滤的.不管是匹配一 个还是多个值,测试大于还是小于已知值,或者检查某个范围的值,共 同点是过滤中使用的值都是已知的.但是,这种过滤方法并不是任 ...

  7. VB程序去nag

    VB程序去nag 我遇到的vb的nag情况是程序一开始就跳出一个nag,汇编代码如下 push AfKayAs_.004067D4 call <jmp.&MSVBVM50.#100> ...

  8. Elementui_day01,基础

    Elementui_day01 1. 安装 npm i element-ui -S 2. 引入 import ElementUI from 'element-ui'; import 'element- ...

  9. vsto 学习

    Object到String类型转换的四种方式 通常object到string有四种方式:(假设有object obj) obj.ToString, Convert.ToString, (string) ...

  10. vue(六)--计算属性(computed)

    计算属性关键词: computed demo1: <div id="app"> <p>原始字符串: {{ message }}</p> < ...