统计定界子数组的数目

简介: 统计定界子数组的数目

说在前面

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

题目描述

给你一个整数数组 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 。

如上图示例一,我们可以得到两个满足条件的子数组:[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

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

  • 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]

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

目录
相关文章
|
存储 弹性计算 负载均衡
阿里云游戏服务器租用配置选型攻略
游戏服务器租用首先要考虑的是云服务器ECS规格、大带宽、数据存储能力及游戏服务器防御能力
2374 1
|
存储 弹性计算 运维
【内含干货PPT下载】DTCC 2020 | 阿里云王涛:阿里巴巴电商数据库上云实践
第十一届中国数据库技术大会(DTCC2020),在北京隆重召开。大会以“架构革新 高效可控”为主题,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨。在数据库智能运维专场上,邀请了阿里云数据库高级技术专家王涛为大家介绍阿里巴巴电商数据库上云的选择、思考与实践。阿里巴巴电商数据库原先是在自己独立的IDC维护的,伴随着阿里巴巴上云项目,数据库轻松实现上云。阿里云云原生管控以及云原生数据库技术可以帮助业务实现平滑上云目标,进而实现资源最大化成本最优化的目标。阿里巴巴希望利用阿里云的技术体系,帮助客户大规模上云,打造自己的运维管控平台。
3402 0
【内含干货PPT下载】DTCC 2020 | 阿里云王涛:阿里巴巴电商数据库上云实践
Python绘图神器Matplotlib、Echarts、Pyecharts 和 Plotly ——可绘制各种图
Python绘图神器Matplotlib、Echarts、Pyecharts 和 Plotly ——可绘制各种图
Python绘图神器Matplotlib、Echarts、Pyecharts 和 Plotly ——可绘制各种图
|
机器学习/深度学习 人工智能 自然语言处理
深度解析Recraft V3:突破文本渲染限制,文生图黑马是怎样炼成的?
Recraft V3模型在文本生成图像(Text-to-Image)领域取得重大突破,通过创新的&quot;Bridging Text Spotting&quot;方法,解决了传统方法中误差累积和性能不佳的问题。该模型采用独立训练的检测器和识别器,并引入Bridge和Adapter机制,确保高质量图像生成。Recraft V3在多个数据集上表现优异,如Total-Text准确率达83.3%,ICDAR 2015达89.5%。其应用前景广泛,涵盖广告设计、教育和娱乐等领域,为文生图技术的实际应用提供了新可能。
616 27
|
开发者
微信公众平台开发基本配置
微信公众平台开发基本配置
652 0
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
舵机和电机
【11月更文挑战第12天】
466 3
|
敏捷开发 数据可视化 测试技术
利用敏捷开发方法优化项目管理
【10月更文挑战第14天】敏捷开发方法论强调适应性和人本价值,通过迭代和增量的方式提升软件交付效率。本文介绍敏捷开发的核心原则、实施步骤及其在项目管理中的应用,包括透明化管理、快速响应变化、提高团队协作和持续改进等方面,旨在帮助团队更高效地运作。
|
数据采集 数据可视化 小程序
vue3+echarts可视化——记录我的2023编程之旅
vue3+echarts可视化——记录我的2023编程之旅
434 1
|
算法 atlas 网络可视化
Gehpi的网络布局
Gehpi的网络布局
1185 0

热门文章

最新文章

下一篇
开通oss服务