统计定界子数组的数目

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

题目描述

给你一个整数数组 nums 和两个整数 minK 以及 maxK 。

nums 的定界子数组是满足下述条件的一个子数组:

子数组中的 最小值 等于 minK 。
子数组中的 最大值 等于 maxK 。
返回定界子数组的数目。

子数组是数组中的一个连续部分。

示例 1:

输入:nums = [1,3,5,2,7,5], minK = 1, maxK = 5
输出:2
解释:定界子数组是 [1,3,5] 和 [1,3,5,2] 。

示例 2:

输入:nums = [1,1,1,1], minK = 1, maxK = 1
输出:10
解释:nums 的每个子数组都是一个定界子数组。共有 10 个子数组。

提示:

  • 2 <= nums.length <= 10^5
  • 1 <= nums[i], minK, maxK <= 10^6

思路分析

首先我们要先理解一下题目的意思,题目会给我们一个数组nums和两个整数minKmink,我们需要统计满足以下条件的子数组数量。

  • 子数组中的 最小值 等于 minK 。
  • 子数组中的 最大值 等于 maxK 。

image.png
如上图示例一,我们可以得到两个满足条件的子数组:[1,3,5] 和 [1,3,5,2] 。

首先我们应该要确认几个点:

  • 1、子数组的大区间划分

因为子数组中的最大值和最小值需要分别满足:最小值 等于 minK、最大值 等于 maxK,所以我们可以通过这个条件划分每个可能存在子数组的大区间,确定每一个区间的左端点。

  • 2、遍历记录最大值和最小值的位置情况

遇到与最大值和最小值相等的数时,我们需要更新其下标。

  • 3、根据最小值和最大值下标位置计算存在子数组数量

我们可以看下这个例子:nums = [2,1,5,2,3,5,4,7,2], minK = 2, maxK = 5

image.png
我们可以从以下几种情况来分析:

  • 1、遍历到下标1时

此时维护的最小值下标minInd = 0,并未遍历到最大值,其下标为初始值maxInd = -1,此时区间的左端点为0(从当前位置往左遍历,第一个满足大于等于minK且小于等于maxK的数的下标),此时的左端点与当前区间中间的子数组数目应该为0。

- Math.max(0,Math.min(minInd,maxInd) - l + 1);
= Math.max(0,Math.min(0,-1) - 0 + 1);
= Math.max(0,-1 - 0 + 1) = 0;
  • 2、遍历到下标2时

此时维护的最小值下标minInd = 0,最大值下标maxInd = 2,此时区间的左端点为0(从当前位置往左遍历,第一个满足大于等于minK且小于等于maxK的数的下标),此时的左端点与当前区间中间的子数组数目应该为1。

- Math.max(0,Math.min(minInd,maxInd) - l + 1);
= Math.max(0,Math.min(0,2) - 0 + 1);
= Math.max(0,0 - 0 + 1) = 1;
  • 3、遍历到下标3时

此时遇到了新的最小值minK,所以需要更新最小值小标位置,此时维护的最小值下标minInd = 3,最大值下标maxInd = 2,区间的左端点为0,此时左端点与当前区间中间的子数组数目应该为3(不考虑前面重复的),如下图:分别为[5,2]、[1,5,2]、[2,1,5,2]

1665933398636.png

- Math.max(0,Math.min(minInd,maxInd) - l + 1);
= Math.max(0,Math.min(3,2) - 0 + 1);
= Math.max(0,2 - 0 + 1) = 3;
  • 4、遍历到下标7时

下标7位置的值为7,它比最大值要大,所以当前位置不可以构成子数组,我们需要更新区间的左端点,新的左端点应该为下一个满足条件的下标。

if(maxK < nums[i] || minK > nums[i]) l = i + 1;

完整AC代码如下:

AC代码

/*** @param {number[]} nums* @param {number} minK* @param {number} maxK* @return {number}*/var countSubarrays = function(nums, minK, maxK) {let l = 0,r = 0,minInd = -1,maxInd = -1,res = 0;for(let i = 0; i < nums.length; i++){if(nums[i] == minK) minInd = i;if(nums[i] == maxK) maxInd = i;if(maxK < nums[i] || minK > nums[i]) l = i + 1;res += Math.max(0,Math.min(minInd,maxInd) - l + 1);}return res;
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/297778.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老胡的周刊(第121期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 clone-voice[2] 一个带 web 界面的声音克隆工…

【大数据】NiFi 的基本使用

NiFi 的基本使用 1.NiFi 的安装与使用1.1 NiFi 的安装1.2 各目录及主要文件 2.NiFi 的页面使用2.1 主页面介绍2.2 面板介绍 3.NiFi 的工作方式3.1 基本方式3.2 选择处理器3.3 组件状态3.4 组件的配置3.4.1 SETTINGS&#xff08;通用配置&#xff09;3.4.2 SCHEDULING&#xff0…

设计模式--职责链模式

实验15&#xff1a;职责链模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解职责链模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用职责链模式解决实际问题。 [实验任务]&#xff1a;财务审批 某物资管理系统…

Window系统显存不足时利用共享内存继续运行

存在问题 在进行实验过程中&#xff0c;时常碰到显存不足的问题&#xff0c;此时要么需要减小模型体积&#xff0c;要么减小batch-size大小&#xff0c;但这势必会对结果造成一定影响&#xff0c;此时我们可以使用GPU共享内存的方法来扩充显存。 解决方法 GPU有几个重要参数…

otter-harbor同步

一. 部署及依赖 otter Github (一). 服务启动 1. mysql 5.6版本以上&#xff0c;作为 otter-manger 使用的数据库 # mysql docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7 --character-set-serverutf8mb4 --collation-serverutf8mb4_un…

2023年12月16日~12月22日(自适应反馈机制下基于卷积神经网络的高清晰反射波反演算法:CNN-RWI)

标题&#xff1a;Adaptive Feedback Convolutional-Neural-Network-Based High-Resolution Reflection-Waveform Inversion 全波形反演&#xff08;FWI&#xff09;是一种非线性拟合观测地震记录从而获得高清晰速度模型的最优化算法。FWI能够通过拟合浅层初至波和反射波获得较准…

<avatar: frontiers of pandora>技术overview

https://www.eurogamer.net/digitalfoundry-2023-avatar-frontiers-of-pandora-and-snowdrop-the-big-developer-tech-interview https://www.youtube.com/watch?vLRI_qgVSwMY&t394s 主要来自euro gamer上digital foundry对于avatar的开发团队Massive工作室的采访&#xf…

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)

1.进程与线程定义 进程包含线程&#xff0c;如一个百度网盘进程&#xff0c;该进程的线程可以有上传&#xff0c;下载。 2.创建线程的三种方式 方式1-继承Thread类 方式2-实现Runnabled接口 1.常规写法 2.匿名内部类写法 方式3-实现Callable接口 示例代码&#xff1a; f1.get…

实现打印一个数字金字塔。例如:输入5,图形如下图所示

1*12**123***1234**** 12345*****#include<stdio.h> void main() {int i,j,l,n,k;scanf("%d",&n);/**********Program**********//********** End **********/ } 当我们拿到这个题目的时候可以看见题目给了我们五个变量&#xff0c;其中n是我们输入的数…

Linux:jumpserver V3的安装与升级(在线离线)(2)

官方文档写的非常详细&#xff0c;我这篇文章时间长了&#xff0c;会随着官方版本更新而落后 JumpServer - 开源堡垒机 - 官网https://www.jumpserver.org/安装和升级在官网也有详细的信息&#xff0c;我写本章是为了记录一下实验 我的系统是centos7.9 在线安装 在确定我们可…

CnosDB如何确保多步操作的最终一致性?

背景 在时序数据库中&#xff0c;资源的操作是一个复杂且关键的任务。这些操作通常涉及到多个步骤&#xff0c;每个步骤都可能会失败&#xff0c;导致资源处于不一致的状态。例如&#xff0c;一个用户可能想要在CnosDB集群中删除一个租户&#xff0c;这个操作可能需要删除租户…

2023 年最受欢迎的 12 款 Chrome 浏览器扩展

掘金2023年度人气创作者打榜中&#xff0c;快来帮我打榜吧&#xff5e; 谷歌浏览器Chrome是目前最受欢迎的浏览器之一&#xff0c;而浏览器扩展则是为了提升用户体验和功能而开发的插件。 2023年谷歌公布了12款最受欢迎的Chrome浏览器扩展。每个都提供独特的功能来增强您的浏览…