给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。 你的任务是找到与 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. 输入: [1,2,2,3,1,4,2] 输出: 6 复制代码
思考:
这道题就是要找出现次数最多的整数元素从第一次出现到最后一次出现的长度,若两个元素出现次数相同取长度较短的。 首先定义一个Map,key为出现的整数元素,value为一个长度为3的i整型数组。 value数组的第0位表示该整数元素出现次数,第1位表示该整数元素第一次出现位置下标,第2位表示最后一次出现位置下标。 然后遍历数组,将元素添加到Map中。 若没有出现过则直接添加进入,初始化value数组为[1,i,i](i为循环变量,第一次出现下标和最后一次出现下标都为i)。 若出现过则更新Map中的value数组,value[0]++(出现次数+1),value[2]=i(最后一次出现位置修改为现在的下标)。 遍历数组结束后再定义变量degree表示数组的度,result表示最终最短连续子数组长度。 循环遍历Map,value[0]比原degree大,则作为新的degree,result就为value[2]-value[1]+1。 value[0]与原degree相等则比较原result与该整数元素的value[2]-value[1]+1长度,取较小的作为result。 最后遍历Map结束,即可获得出现次数最多的最短连续子数组长度。 复制代码
实现:
class Solution {
public int findShortestSubArray(int[] nums) {
Map<Integer,int[]> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (!map.containsKey(nums[i])){
map.put(nums[i],new int[]{1,i,i});
}else{
int[] temp = map.get(nums[i]);
temp[0]++;
temp[2] = i;
}
}
int degree = 0,result = 0;
for (int[] value: map.values()){
if (value[0] > degree){
degree = value[0];
result = value[2] - value[1] + 1;
}else if (value[0] == degree){
result = Math.min(value[2] - value[1] + 1,result);
}
}
return result;
}
}复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript DOM编程艺术 (第2版)
[英] Jeremy Keith、[加] Jeffrey Sambells / 杨涛、王建桥、杨晓云 等 / 人民邮电出版社 / 2011-4 / 49.00元
JavaScript是Web开发中最重要的一门语言,它强大而优美。无论是桌面开发,还是移动应用。JavaScript都是必须掌握的技术。W3C的DOM标准是开发Web应用的基石。已经得到所有现代浏览器的支持,这使得跨平台Web开发成了一件轻松惬意的事。 本书是超级畅销书的升级版,由倡导Web标准的领军人物执笔,揭示了前端开发的真谛,是学习JavaScript和DOM开发的必读之作。 本......一起来看看 《JavaScript DOM编程艺术 (第2版)》 这本书的介绍吧!
HTML 编码/解码
HTML 编码/解码
RGB HSV 转换
RGB HSV 互转工具