当前位置: 首页 > news >正文

697.数组的度

697.数组的度

给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
示例 1:
输入:nums = [1,2,2,3,1]
输出:2
解释:
输入数组的度是 2 ,因为元素 1 和 2 的出现频数最大,均为 2 。
连续子数组里面拥有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短连续子数组 [2, 2] 的长度为 2 ,所以返回 2 。
示例 2:
输入:nums = [1,2,2,3,1,4,2]
输出:6
解释:
数组的度是 3 ,因为元素 2 重复出现 3 次。
所以 [2,2,3,1,4,2] 是最短子数组,因此返回 6 。
提示:

nums.length 在 1 到 50,000 范围内。
nums[i] 是一个在 0 到 49,999 范围内的整数。
解题思路
找频率最大的数并且其的子数组长度最短,本题坑点是会存在多组数据,并且出现频率最大且相同,这就要求还需要统计起始位置和终止位置来计算最短子数组。如果不考虑最短子数组,如代码一;考虑的话就必须用带有映射关系的hash表来进行存储和遍历。
代码一
这个没考虑最短子数组

class Solution {
public:int findShortestSubArray(vector<int>& nums) {const int N = 5e4+10;int a[N];memset(a,0,sizeof a);int m=-1;int number=-1;for(int i=0;i<nums.size();i++){a[nums[i]]++;if(m<a[nums[i]]){m=a[nums[i]];number=nums[i];}}//cout<<m<<" "<<number<<endl;int les=0;bool flag=false;//标记是否遇到最大频率的数for(int i=0;i<nums.size();i++){if(number==nums[i]) flag = true;if(flag){if(m!=0){if(number!=nums[i]){les++;}else{m--;les++;}}}}return les;}
};

代码二

class Solution {
public:int findShortestSubArray(vector<int>& nums) {unordered_map<int,vector<int>> mp;int l=nums.size();for(int i=0;i<l;i++){if(mp.count(nums[i])){mp[nums[i]][0]++;//次数统计mp[nums[i]][2]=i;}else{mp[nums[i]] = {1,i,i};}}int maxNum=0,minlen=0;//maxNum表示出现频率,minlen表示最短子串for(auto& [_,v]:mp){//用_表示占位不会用到这个key,用v表示映射后的三维关系if(maxNum<v[0]){maxNum = v[0];minlen = v[2]-v[1]+1;}else if (maxNum==v[0]){    if(minlen>v[2]-v[1]+1){    minlen = v[2] - v[1] + 1;    }}}return minlen;    }
};

auto& [_, vec] : mp 这段代码使用了C++17的结构化绑定(Structured Bindings)特性,用于遍历一个关联容器(如std::map或std::unordered_map)。具体来说,这段代码的作用是遍历mp这个容器,并将每个元素的键绑定到_,将每个元素的值绑定到vec。

auto&:表示引用类型,确保在遍历过程中不会创建临时对象,从而提高效率。
[_, vec]:结构化绑定,将当前遍历到的元素的键和值分别绑定到_和vec。
mp:被遍历的容器,通常是一个std::map或std::unordered_map。
在这段代码中,_通常是一个占位符,表示我们不关心键的值,而vec则是我们关心的值部分。这种写法在只需要访问容器中的值而不需要键时非常有用。

例如,假设mp是一个std::map<int, std::vector<int>>类型的容器,那么这段代码的作用就是遍历mp中的每一个元素,并将每个元素的值(即std::vector)绑定到vec,而忽略键。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Marked: 一款高效、轻量级且全功能的Markdown解析器
  • 【C语言必学知识点六】自定义类型——结构体
  • 单品月GMV破4900W,2024防晒衣赛道在狂飙!
  • 以下是一些对公打款的测试方法
  • 【微信小程序】自定义 tabBar
  • 计算机毕设选题推荐-基于python的豆瓣电子图书数据可视化分析
  • Python脚本参数总结:argparse库基础用法
  • docker容器使用aconda运行python程序
  • KVM是什么,如何给一台Linux系统使用KVM技术变成好几个不同配置的Linux系统?
  • 回首“八年级上册语文课本”-----原文+感慨
  • angular xlsx-style,复杂表头样式导出
  • Redis的内存淘汰策略-noeviction
  • [kylin M900]麒麟操作系统固件修改与合成
  • 超级会员卡积分收银系统源码,一站式解决方案,可以收银的小程序 带完整的安装代码包以及搭建部署教程
  • WAF和防火墙有什么区别
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【翻译】babel对TC39装饰器草案的实现
  • ComponentOne 2017 V2版本正式发布
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES6系列(二)变量的解构赋值
  • JavaScript的使用你知道几种?(上)
  • Laravel5.4 Queues队列学习
  • LeetCode算法系列_0891_子序列宽度之和
  • Mocha测试初探
  • Nacos系列:Nacos的Java SDK使用
  • Redux系列x:源码分析
  • vue-loader 源码解析系列之 selector
  • 创建一个Struts2项目maven 方式
  • 搭建gitbook 和 访问权限认证
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • Prometheus VS InfluxDB
  • scrapy中间件源码分析及常用中间件大全
  • 数据可视化之下发图实践
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (论文阅读40-45)图像描述1
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)nsfocus-绿盟科技笔试题目
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net Memory Profiler的使用举例
  • .net refrector
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .Net的DataSet直接与SQL2005交互
  • .NET分布式缓存Memcached从入门到实战