最大值减去最小值小于或等于 num 的子数组数量问题
最大值减去最小值小于或等于 num 的子数组数量问题
作者:Grey
原文地址:
博客园:最大值减去最小值小于或等于 num 的子数组数量问题
CSDN:最大值减去最小值小于或等于 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]
中的最小值。
思路
本题可以用滑动窗口算法来解,算法说明见:滑动窗口最大值问题
根据题目意思,我们可以得到如下三个结论
第一个结论:arr[L..R]
达标,则 arr 中内部的任何一个子数组都达标;
第二个结论:arr[L..R]
不达标,则 arr 扩充后肯定也不达标;
第三个结论:L...R
范围如果达标,其子数组个数为:R - L
。
利用滑动窗口算法,我们可以得到必须以l位置作为左边界的情况下,有多少达标的数组。
完整代码如下(含对数器)
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static int getNum(int[] arr, int num) {
LinkedList<Integer> qMax = new LinkedList<>();
LinkedList<Integer> qMin = new LinkedList<>();
int ans = 0;
int l = 0;
int r = 0;
while (l < arr.length) {
while (r < arr.length) {
while (!qMax.isEmpty() && arr[qMax.peekLast()] <= arr[r]) {
qMax.pollLast();
}
qMax.addLast(r);
while (!qMin.isEmpty() && arr[qMin.peekLast()] >= arr[r]) {
qMin.pollLast();
}
qMin.addLast(r);
if (arr[qMax.peekFirst()] - arr[qMin.peekFirst()] > num) {
break;
}
r++;
}
// r是以l作为左边界,第一个不满足条件的位置
ans += (r - l);
// 弹出过期位置
if (!qMax.isEmpty() && qMax.peekFirst() == l) {
qMax.pollFirst();
}
// 弹出过期位置
if (!qMin.isEmpty() && qMin.peekFirst() == l) {
qMin.pollFirst();
}
l++;
}
return ans;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
System.out.println(getNum(arr,m));
in.close();
}
}
更多
最大值减去最小值小于或等于 num 的子数组数量问题的更多相关文章
- 最大值减去最小值小于或等于num的子数组数量
[说明]: 本文是左程云老师所著的<程序员面试代码指南>第一章中“最大值减去最小值小于或等于num的子数组数量”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路, ...
- 左神算法书籍《程序员代码面试指南》——1_10最大值减去最小值小于或等于num的子数组数量
[题目]给定数组arr和整数num,共返回有多少个子数组满足如下情况:max(arr[i.j]) - min(arr[i.j]) <= num max(arfi.j])表示子数组ar[ij]中的 ...
- 牛客 最大值减去最小值小于或等于 num 的子数组数量
题目链接:https://www.nowcoder.com/practice/5fe02eb175974e18b9a546812a17428e?tpId=101&tqId=33086& ...
- 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)
第二课主要介绍第一课余下的BFPRT算法和第二课部分内容 1.BFPRT算法详解与应用 找到第K小或者第K大的数. 普通做法:先通过堆排序然后取,是n*logn的代价. // O(N*logK) pu ...
- [程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(单调队列)
题目 给定数组arr和整数num,求数组的子数组中有多少个的满足"最大值减去最小值<=num". 解题思路 分析题目,有结论: 如果数组arr[i...j]满足条件,则它的每 ...
- 【队列】最大值减去最小值小于等于num的子数组数量
摘自<程序员代码面试指南> 题目: 给定数组 arr 和整数 num, 共返回有多少个⼦数组满⾜如下情况:max(arr[i...j]) - min(arr[i...j]) <= n ...
- 栈和队列----最大值减去最小值小于等于num的子数组的数量
最大值减去最小值小于等于num的子数组的数量 给定数组arr和整数 num,共返回有多少个数组满足下列情况: max(arr[i..j])-min(arr[i..j])<=num.其中max(a ...
- 《程序员代码面试指南》第一章 栈和队列 最大值减去最小值小于或等于num的数量
题目 给定整数数组arr和整数num,共返回多少的数组满足如下情况 max(arr[i...j]) - min(arr[i...j]) <= num max(arr[i...j])表示数组arr ...
- 算法总结之 最大值减去最小值或等于num的子数组数量
给定数组arr和整数num,共返回有多少个子数组满足 <= num 数组长度N 时间复杂度O(N) package TT; import java.util.LinkedList; pu ...
- [LeetCode] Number of Subarrays with Bounded Maximum 有界限最大值的子数组数量
We are given an array A of positive integers, and two positive integers L and R (L <= R). Return ...
随机推荐
- k8s中使用到的各种证书图示
- java基础二、类与继承
员工类 Employee, 经理类:Manager public class Employee { private String name; private double salary; privat ...
- CentOS 7.9 安装 redis-6.2.0
一.CentOS 7.9 安装 redis-6.2.0 1 下载地址:https://download.redis.io/releases/redis-6.2.0.tar.gz 2 安装gcc来进行编 ...
- python-数据描述与分析2(利用Pandas处理数据 缺失值的处理 数据库的使用)
2.利用Pandas处理数据2.1 汇总计算当我们知道如何加载数据后,接下来就是如何处理数据,虽然之前的赋值计算也是一种计算,但是如果Pandas的作用就停留在此,那我们也许只是看到了它的冰山一角,它 ...
- LeNet-论文阅读
概述 Yann LeCun, Leon Bottou, Yoshua Bengio, and Patrick Haffner的论文<Gradient-Based Learning Applied ...
- 一键上手时下最火AI作画工具
摘要:在华为云ModelArts上, 无需考虑计算资源.环境的搭建,就算不懂代码,也能按照教程案例,通过Stable Diffusion成为艺术大师. 本文分享自华为云社区<跟着华为云Model ...
- scrapy操作mysql/批量下载图片
1.操作mysql items.py meiju.py 3.piplines.py 4.settings.py -------------------------------------------- ...
- Linux基础_5_文件管理
创建 touch 文件名 #创建文件 stat 文件名 #查看文件属性 touch -am 文件名 #更改文件的访问时间及修改时间 删除 rm -rf s/* #递归强制删除s目录下的所有内容(包括文 ...
- 成功解决IDEA中建立新项目Maven会默认选择配置(图解详细说明)
文章目录 1.File-->Other Settings --> Settings for New Projects 2.选择自己的maven配置 3.效果展示(我这里省略建立新项目的过程 ...
- 35.ListSerializer详解
ListSerializer继承了BaseSerializer 一般情况下我们不直接使用ListSerializer ListSerializer会自动调用,序列化many=True的字段时,会自动调 ...