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

作者:Grey

原文地址:

博客园:最大值减去最小值小于或等于 num 的子数组数量问题

CSDN:最大值减去最小值小于或等于 num 的子数组数量问题

题目描述

给定数组 arr 和整数 num,共返回有多少个子数组满足如下情况:

  1. max(arr[i...j]) - min(arr[i...j]) <= num

其中max(arr[i...j])表示子数组arr[i...j]中的最大值,min[arr[i...j])表示子数组arr[i...j]中的最小值。

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

思路

本题可以用滑动窗口算法来解,算法说明见:滑动窗口最大值问题

根据题目意思,我们可以得到如下三个结论

第一个结论:arr[L..R]达标,则 arr 中内部的任何一个子数组都达标;

第二个结论:arr[L..R]不达标,则 arr 扩充后肯定也不达标;

第三个结论:L...R 范围如果达标,其子数组个数为:R - L

利用滑动窗口算法,我们可以得到必须以l位置作为左边界的情况下,有多少达标的数组。

完整代码如下(含对数器)


  1. import java.util.LinkedList;
  2. import java.util.Scanner;
  3. public class Main {
  4. public static int getNum(int[] arr, int num) {
  5. LinkedList<Integer> qMax = new LinkedList<>();
  6. LinkedList<Integer> qMin = new LinkedList<>();
  7. int ans = 0;
  8. int l = 0;
  9. int r = 0;
  10. while (l < arr.length) {
  11. while (r < arr.length) {
  12. while (!qMax.isEmpty() && arr[qMax.peekLast()] <= arr[r]) {
  13. qMax.pollLast();
  14. }
  15. qMax.addLast(r);
  16. while (!qMin.isEmpty() && arr[qMin.peekLast()] >= arr[r]) {
  17. qMin.pollLast();
  18. }
  19. qMin.addLast(r);
  20. if (arr[qMax.peekFirst()] - arr[qMin.peekFirst()] > num) {
  21. break;
  22. }
  23. r++;
  24. }
  25. // r是以l作为左边界,第一个不满足条件的位置
  26. ans += (r - l);
  27. // 弹出过期位置
  28. if (!qMax.isEmpty() && qMax.peekFirst() == l) {
  29. qMax.pollFirst();
  30. }
  31. // 弹出过期位置
  32. if (!qMin.isEmpty() && qMin.peekFirst() == l) {
  33. qMin.pollFirst();
  34. }
  35. l++;
  36. }
  37. return ans;
  38. }
  39. public static void main(String[] args) {
  40. Scanner in = new Scanner(System.in);
  41. int n = in.nextInt();
  42. int m = in.nextInt();
  43. int[] arr = new int[n];
  44. for (int i = 0; i < n; i++) {
  45. arr[i] = in.nextInt();
  46. }
  47. System.out.println(getNum(arr,m));
  48. in.close();
  49. }
  50. }

更多

算法和数据结构笔记

最大值减去最小值小于或等于 num 的子数组数量问题的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 栈和队列----最大值减去最小值小于等于num的子数组的数量

    最大值减去最小值小于等于num的子数组的数量 给定数组arr和整数 num,共返回有多少个数组满足下列情况: max(arr[i..j])-min(arr[i..j])<=num.其中max(a ...

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

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

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

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

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

随机推荐

  1. k8s中使用到的各种证书图示

  2. java基础二、类与继承

    员工类 Employee, 经理类:Manager public class Employee { private String name; private double salary; privat ...

  3. 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来进行编 ...

  4. python-数据描述与分析2(利用Pandas处理数据 缺失值的处理 数据库的使用)

    2.利用Pandas处理数据2.1 汇总计算当我们知道如何加载数据后,接下来就是如何处理数据,虽然之前的赋值计算也是一种计算,但是如果Pandas的作用就停留在此,那我们也许只是看到了它的冰山一角,它 ...

  5. LeNet-论文阅读

    概述 Yann LeCun, Leon Bottou, Yoshua Bengio, and Patrick Haffner的论文<Gradient-Based Learning Applied ...

  6. 一键上手时下最火AI作画工具

    摘要:在华为云ModelArts上, 无需考虑计算资源.环境的搭建,就算不懂代码,也能按照教程案例,通过Stable Diffusion成为艺术大师. 本文分享自华为云社区<跟着华为云Model ...

  7. scrapy操作mysql/批量下载图片

    1.操作mysql items.py meiju.py 3.piplines.py 4.settings.py -------------------------------------------- ...

  8. Linux基础_5_文件管理

    创建 touch 文件名 #创建文件 stat 文件名 #查看文件属性 touch -am 文件名 #更改文件的访问时间及修改时间 删除 rm -rf s/* #递归强制删除s目录下的所有内容(包括文 ...

  9. 成功解决IDEA中建立新项目Maven会默认选择配置(图解详细说明)

    文章目录 1.File-->Other Settings --> Settings for New Projects 2.选择自己的maven配置 3.效果展示(我这里省略建立新项目的过程 ...

  10. 35.ListSerializer详解

    ListSerializer继承了BaseSerializer 一般情况下我们不直接使用ListSerializer ListSerializer会自动调用,序列化many=True的字段时,会自动调 ...