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

最大值,减去,最小值,小于,等于,num,数组,数量,问题 · 浏览次数 : 66

小编点评

**算法思路:** 1. 使用两个链表 `qMax` 和 `qMin` 来记录最大值和最小值的下标。 2. 遍历数组 `arr`,对于每个元素,如果 `max(arr[i...j])` 大于 `min(arr[i...j])`,则将 `r` 赋值给 `qMax` 的末尾,并将 `r` 添加到 `ans` 中。 3. 如果 `qMax` 的首部位置与 `l` 相等,则将 `qMax` 的首部元素(最大值)从 `qMax` 中移除,并将 `l` 更新到 `qMax` 的首部位置。 4. 如果 `qMin` 的首部位置与 `l` 相等,则将 `qMin` 的首部元素(最小值)从 `qMin` 中移除,并将 `l` 更新到 `qMin` 的首部位置。 5. 如果 `r` 的值大于 `num`,则跳出循环,因为 `r` 超出了有效范围。 6. 返回 `ans` 的值。 **时间复杂度:**O(n),其中 n 是数组长度。 **空间复杂度:**O(n),因为我们使用两个链表来记录最大值和最小值的下标。 **示例:** **输入:** ``` 5 1 2 3 4 5 ``` **输出:** ``` 4 ``` **解释:** 数组的有效子数组有 4 个,因为最大值在数组的第 2 和 4 个位置出现,最小值在数组的第 1 和 3 个位置出现。

正文

最大值减去最小值小于或等于 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]中的最小值。

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

思路

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

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

第一个结论: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 的子数组数量问题 作者:Grey 原文地址: 博客园:最大值减去最小值小于或等于 num 的子数组数量问题 CSDN:最大值减去最小值小于或等于 num 的子数组数量问题 题目描述 给定数组 arr 和整数 num,共返回有多少个子数组满足如下情况: max(ar

程序员失业日记1:工作五年,交接半天

最近发现越来越多的小伙伴被公司裁员,有的是因为公司业绩不景气被裁员,有的是因为压力太大离职。很多公司都在裁人、减员。找工作也比之前难。刚好去年我也被上家裁员了,正好做一个系列的日志,希望能帮到在找工作的你。 本文为第一篇失业日记:工作五年,交接只需要半天。 上午敲代码,下午HR谈话 离职那天天,一切

【数据结构和算法】Trie树简介及应用详解

Trie树,即字典树,又称单词查找树或键树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

自动化测试数据生成:Asp.Net Core单元测试利器AutoFixture详解

引言 在我们之前的文章中介绍过使用Bogus生成模拟测试数据,今天来讲解一下功能更加强大自动生成测试数据的工具的库"AutoFixture"。 什么是AutoFixture? AutoFixture 是一个针对 .NET 的开源库,旨在最大程度地减少单元测试中的“安排(Arrange)”阶段,以提高

VUE系列之性能优化--懒加载

一、懒加载的基本概念 懒加载是一种按需加载技术,即在用户需要时才加载相应的资源,而不是在页面初始加载时一次性加载所有资源。这样可以减少页面初始加载的资源量,提高页面加载速度和用户体验。 二、Vue 中的懒加载 在 Vue.js 中,懒加载主要用于路由组件的按需加载。Vue Router 提供了非常便

[转帖]NGINX官方文档[译]:HTTP负载均衡

负载均衡是一种优化资源利用率、提升最大吞吐量、减少延迟、提高系统容错率的常用技术。 要使用Nginx对一组服务器的HTTP流量进行负载均衡,首先需要使用upstream定义一组后端服务器(配置于http字段中),然后使用server对upstream组中的服务进行配置(同样配置于http字段中,注意

还不知道线程池的好处?快来了解一下

摘要:线程池的好处:重用存在的线程,减少对象创建、消亡的开销,性能佳;可以有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞。 本文分享自华为云社区《【高并发】线程池介绍》,作者: 冰 河 。 1.new Thread弊端 (1)每次new Thread新建对象,性能差。

用 KV 缓存量化解锁长文本生成

很高兴和大家分享 Hugging Face 的一项新功能: KV 缓存量化 ,它能够把你的语言模型的速度提升到一个新水平。 太长不看版: KV 缓存量化可在最小化对生成质量的影响的条件下,减少 LLM 在长文本生成场景下的内存使用量,从而在内存效率和生成速度之间提供可定制的权衡。 你是否曾尝试过用语

京东云RASP云原生安全免疫创新实践

随着网络攻击事件整体呈上升趋势,应用作为网络入口承载着大量业务和流量,因此成为了安全的重灾区。本文介绍京东云RASP云原生安全免疫平台工作原理以及最佳实践,减少大量的误报和漏报问题。

外译笔记 | 比尔盖茨:AI与智能手机和互联网一样具有革命性

这篇文章,值得关注的是,盖茨提出对人工智能如何可以减少世界上最严重的不公平现象的思考,以及我们关注的人工智能风险问题。