栈和队列----最大值减去最小值小于等于num的子数组的数量
最大值减去最小值小于等于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的子数组的数量的更多相关文章
- [程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(单调队列)
题目 给定数组arr和整数num,求数组的子数组中有多少个的满足"最大值减去最小值<=num". 解题思路 分析题目,有结论: 如果数组arr[i...j]满足条件,则它的每 ...
- 【队列】最大值减去最小值小于等于num的子数组数量
摘自<程序员代码面试指南> 题目: 给定数组 arr 和整数 num, 共返回有多少个⼦数组满⾜如下情况:max(arr[i...j]) - min(arr[i...j]) <= n ...
- 最大值减去最小值小于或等于num的子数组数量
[说明]: 本文是左程云老师所著的<程序员面试代码指南>第一章中“最大值减去最小值小于或等于num的子数组数量”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路, ...
- 《程序员代码面试指南》第一章 栈和队列 最大值减去最小值小于或等于num的数量
题目 给定整数数组arr和整数num,共返回多少的数组满足如下情况 max(arr[i...j]) - min(arr[i...j]) <= num max(arr[i...j])表示数组arr ...
- 牛客 最大值减去最小值小于或等于 num 的子数组数量
题目链接:https://www.nowcoder.com/practice/5fe02eb175974e18b9a546812a17428e?tpId=101&tqId=33086& ...
- 左神算法书籍《程序员代码面试指南》——1_10最大值减去最小值小于或等于num的子数组数量
[题目]给定数组arr和整数num,共返回有多少个子数组满足如下情况:max(arr[i.j]) - min(arr[i.j]) <= num max(arfi.j])表示子数组ar[ij]中的 ...
- 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)
第二课主要介绍第一课余下的BFPRT算法和第二课部分内容 1.BFPRT算法详解与应用 找到第K小或者第K大的数. 普通做法:先通过堆排序然后取,是n*logn的代价. // O(N*logK) pu ...
- 算法总结之 最大值减去最小值或等于num的子数组数量
给定数组arr和整数num,共返回有多少个子数组满足 <= num 数组长度N 时间复杂度O(N) package TT; import java.util.LinkedList; pu ...
- 洛谷p2216 多次单调队列,扫描矩阵中的最大值减去最小值最的固定大小子矩阵
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...
随机推荐
- 新手必看:PyCharm安装教程,Python开发者的有力工具
PyCharm是由JetBrains打造的一款Python IDE,VS2010的重构插件Resharper就是出自JetBrains之手. 同时支持Google App Engine,PyCharm ...
- everspin最新1Gb容量扩大MRAM吸引力
everspin提供了8/16-bit的DDR4-1333MT/s(667MHz)接口,但与较旧的基于DDR3的MRAM组件一样,时序上的差异使得其难以成为DRAM(动态随机存取器)的直接替代品. ...
- 8.python内置模块之random模块简介
Python中的random模块用于生成随机数. 常用的7个函数: 1.random.random():返回一个[0,1)之间的随机浮点值(双精度) 2.random.uniform(a,b):返回[ ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(2)
Linux 系统定制原理 虚拟根目录 我们的目标是为了完成目标系统(也就是我们要做的系统),他是一个可以独立运行的系统,不依赖雨主系统和临时系统,根据 Linux 系统的特点它需要存放在根目录下面,但 ...
- 五种编程语言解释数据结构与算法——顺序表2(java与C++语言实现)
5.java实现方式: 5.1.顺序表的抽象结构 package com.xgp.顺序表; public interface MyList<T> { //1. initList(& ...
- float浮动以及案例演示
浮动元素会影响后边的元素,但不会影响前边的元素 清除浮动: 方法一:在浮动元素后面添加一个空元素 <!DOCTYPE html> <html lang="en"& ...
- JavaDay11
Java learning_Day11 本人学习视频用的是马士兵的,也在这里献上 <链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA> ...
- CSRF 攻击的应对之道 转载
CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患,比如 ...
- Hibernate注释
Hibernate注释映射一.PO类的基本注释1.@Entity:将pojo类标记成实体,可以指定一个name属性,指定实体类的名称.默认一该类的类名作为实体类的名称 2.@Table:注释改持久化类 ...
- 170.分组-group、permission、user的操作
分组 1.Group.objects.create(group_name):创建分组. 2.group.permissions:某个分组上的权限.多对多关系. (1)group.permissions ...