最大值减去最小值小于等于num的子数组的数量

  

  给定数组arr和整数 num,共返回有多少个数组满足下列情况: max(arr[i..j])-min(arr[i..j])<=num。其中max(arr[i..j]) 表示子数组arr[i..j] 中的最大值,min(arr[i..j]) 表示子数组arr[i..j] 中的最小值。如果数组的长度为N,要求时间复杂度是 O(N)。

  【解析】

  使用双端队列,qmax维护着窗口子数组arr[i..j]的最大值更新的结构,qmin维护着窗口子数组arr[i..j]的最小值更新的结构,所有下标值最多进qmax和qmin 一次,出qmax和qmin 一次,i 和j 的值也不断增加,从不减小,所以时间复杂度是O(N)。

  通过题目可以分析得到以下两个结论:

  1)如果子数组arr[i..j]满足条件,即max(arr[i..j])-min(arr[i..j])<=num,那么arr[k..l](i<=k<=l<=j)肯定都满足条件,即若一个数组满足条件,它的所有子数组肯定满足条件。

  2)如果子数组arr[i..j]不满足条件,即max(arr[i..j])-min(arr[i..j])>num,那么arr[k..l](k<=i<=j<=l)肯定不满足条件,即若一个数组不满足条件,所有包含它的数组肯定都不满足条件。

  

package com.test;

import java.util.LinkedList;

/**
* Created by Demrystv.
*
* 所有下标值最多进qmax和qmin 一次,出qmax和qmin 一次,i 和j 的值也不断增加,从不减小,所以时间复杂度是O(N)
*/
public class GetNum {
public int getNum(int[] arr, int num){
if (arr.length==0 || arr==null){
return 0;
} //双端队列,qmax维护着窗口子数组arr[i..j]的最大值更新的结构,qmin维护着窗口子数组arr[i..j]的最小值更新的结构, //若某个数组满足条件,那么它所包含的子数组肯定都满足条件
//若某数组不满足条件,那么包含它的所有数组肯定不满足条件
LinkedList<Integer> qmax = new LinkedList<Integer>();
LinkedList<Integer> qmin = new LinkedList<Integer>();
int i = 0;
int j = 0;
int res = 0;
while (i<arr.length){
while (j<arr.length){
while (!qmin.isEmpty() && arr[qmin.peekLast()]>= arr[j]){
qmin.pollLast();
}
qmin.addLast(j); while (!qmax.isEmpty() && arr[qmax.peekLast()]<= arr[j]){
qmax.pollLast();
}
qmax.addLast(j); if (arr[qmax.getFirst()] - arr[qmin.getFirst()] > num){
break;
} j++;
} //双端队列的队头到了起始点,就将他弹出来
if (qmin.peekFirst() == i){
qmin.pollFirst();
}
if (qmax.peekFirst() == i){
qmax.pollFirst();
} //利用的结论是 若arr[i..j]满足条件,那么arr[i..j-1]必定满足条件;若arr[i..j]满足条件,那么包含arr[i..j]的数组必定不满足条件
res += j - i;
i++;
}
return res;
}
}

栈和队列----最大值减去最小值小于等于num的子数组的数量的更多相关文章

  1. [程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(单调队列)

    题目 给定数组arr和整数num,求数组的子数组中有多少个的满足"最大值减去最小值<=num". 解题思路 分析题目,有结论: 如果数组arr[i...j]满足条件,则它的每 ...

  2. 【队列】最大值减去最小值小于等于num的子数组数量

    摘自<程序员代码面试指南> 题目: 给定数组 arr 和整数 num, 共返回有多少个⼦数组满⾜如下情况:max(arr[i...j]) - min(arr[i...j]) <= n ...

  3. 最大值减去最小值小于或等于num的子数组数量

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第一章中“最大值减去最小值小于或等于num的子数组数量”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路, ...

  4. 《程序员代码面试指南》第一章 栈和队列 最大值减去最小值小于或等于num的数量

    题目 给定整数数组arr和整数num,共返回多少的数组满足如下情况 max(arr[i...j]) - min(arr[i...j]) <= num max(arr[i...j])表示数组arr ...

  5. 牛客 最大值减去最小值小于或等于 num 的子数组数量

    题目链接:https://www.nowcoder.com/practice/5fe02eb175974e18b9a546812a17428e?tpId=101&tqId=33086& ...

  6. 左神算法书籍《程序员代码面试指南》——1_10最大值减去最小值小于或等于num的子数组数量

    [题目]给定数组arr和整数num,共返回有多少个子数组满足如下情况:max(arr[i.j]) - min(arr[i.j]) <= num max(arfi.j])表示子数组ar[ij]中的 ...

  7. 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)

    第二课主要介绍第一课余下的BFPRT算法和第二课部分内容 1.BFPRT算法详解与应用 找到第K小或者第K大的数. 普通做法:先通过堆排序然后取,是n*logn的代价. // O(N*logK) pu ...

  8. 算法总结之 最大值减去最小值或等于num的子数组数量

    给定数组arr和整数num,共返回有多少个子数组满足  <= num 数组长度N    时间复杂度O(N) package TT; import java.util.LinkedList; pu ...

  9. 洛谷p2216 多次单调队列,扫描矩阵中的最大值减去最小值最的固定大小子矩阵

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...

随机推荐

  1. CentOS6.5安装指定的PHP版本(php5.5)(转)

    查询是否安装有php #rpm -qa|grep php 删除之前安装的php版本 (yum install 安装) #rpm -e php-fpm-5.3.3-47.el6.x86_64 --nod ...

  2. scrapy框架中多个spider,tiems,pipelines的使用及运行方法

    用scrapy只创建一个项目,创建多个spider,每个spider指定items,pipelines.启动爬虫时只写一个启动脚本就可以全部同时启动. 本文代码已上传至github,链接在文未. 一, ...

  3. Javascript 基础学习(六)js 的对象

    定义 对象是JS中的引用数据类型.对象是一种复合数据类型,在对象中可以保存多个不同数据类型的属性.使用typeof检查一个对象时,会返回object. 分类 内置对象 由ES标准定义的对象,在任何ES ...

  4. include 和require 区别

    include和require的区别  1.include() 包含文件 2.include_once(filename)如果已经包含,则不再执行include_once 3.requirerequi ...

  5. Ajax0002: 省市县三级联动案例

  6. C#设计模式学习笔记:(5)原型模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,记录一下学习过程以备后续查用.  一.引言 很多人说原型设计模式会节省机器内存,他们说 ...

  7. java面向对象入门(1)-入门介绍

    在本 Java OOPs 概念教程中,我们将学习四种主要的面向对象原则 -- 抽象.封装.继承和多态性.它们也被称为面向对象编程范式的四大支柱. _抽象_是在不考虑无关细节的情况下公开实体基本细节的过 ...

  8. Html介绍,标签的语法

    1.标签由英文"<"和">"括起来组成,如<html>就是一个标签2.html中的标签一般都是成对成对出现的,分为开始标签和结束标签.结 ...

  9. Markdown语法,及其在typora中的快捷键,学写博客吧!!!

    前言 Markdown (MD) 是现在最流行的一种文档书写语言格式.平常写笔记,写博客,写计划再好不过了.个人觉得使用很简单,右击鼠标,有你想要的操作. Typora是简洁.操作简单.功能强大.方便 ...

  10. STT-MRAM存在的两个弊端

    随着自旋转移矩效应的发现以及材料和结构的优化,基于自旋转移矩效应的STT-MRAM器件应运而生.自从自旋转移矩效应被证实以来,一方面研究人员通过大量的努力尝试降低磁化反转的临界电流,增加热稳定性:另一 ...