统计定界子数组的数目

2023-12-25 00:52
文章标签 统计 数组 数目 定界

本文主要是介绍统计定界子数组的数目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

说在前面

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

题目描述

给你一个整数数组 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.chinasem.cn/article/533739

相关文章

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

IDEA与MyEclipse代码量统计方式

《IDEA与MyEclipse代码量统计方式》文章介绍在项目中不安装第三方工具统计代码行数的方法,分别说明MyEclipse通过正则搜索(排除空行和注释)及IDEA使用Statistic插件或调整搜索... 目录项目场景MyEclipse代码量统计IDEA代码量统计总结项目场景在项目中,有时候我们需要统计

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方