最大值减去最小值小于等于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. JS隐藏显示图片

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  2. c 指针改变数字

    之前已经有了: gcc -c day4.c -Wall gcc -o day4.exe day4.o 所以才会有以下结果

  3. luogu P3834 【模板】可持久化线段树 1(主席树) 查询区间 [l, r] 内的第 k 小/大值

    ————————————————版权声明:本文为CSDN博主「ModestCoder_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https:// ...

  4. Java Web笔记(2)

    学习笔记,狂神说java,链接:https://www.bilibili.com/video/av68833391 5.Maven 我为什么要学习这个技术? 在Javaweb开发中,需要使用大量的ja ...

  5. 《茶余饭后小故事》MV*、MVC、MVP、MVVM的前世今生

    今天我们讲讲历史,讲讲故事,不扯高深术语. MV*表示的意思是:M(Model逻辑层) + View(视图层) + *(中间者).上帝提出了这个逻辑与视图分离,用中间者进行连接的伟大思想,并将实现这个 ...

  6. 关于所学,及JNI问题

    上周每天学习Java两个小时,随后两个小时里对教材上的例子进行验证,学会了如何使用Javac对文件进行终端编译,输出,但由于所下载的 jdk版本问题出现了JNI问题,正在尝试解决.并学会了如何使用ec ...

  7. discuz!ml-3.x版本getshell

    影响范围: discuz! ml v3.x全版本. 产生原因 漏洞原因:Discuz!ML 系统对cookie中的l接收的language参数内容未过滤,导致字符串拼接,从而执行php代码. 利用ex ...

  8. 数据库MySQL之存储过程

    存储过程的定义 存储过程是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象.其在思想上与面向对象编程中函数的定义与调用一致,存储过程只是SQL语言维度上的封装与运用. 存储过程的优缺点 优 ...

  9. win10创建本地用户

    win+r,输入lusrmgr.msc win+i

  10. Linux系统之网络相关的命令

    Linux系统之网络相关的命令 网络概述 网络:通过通信介质和通信设备 将分布不同地点的两台或多台计算机,经过相应的程序实现通信switch 交换机router 路由器网络的功能:数据通信:利用网络传 ...