leetcode 697. 数组的度(hashmap)
作者:互联网
给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
示例 1:
输入:[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.
解题思路
关键找到出现次数最多的元素(可能多个),相同元素的头尾元素的距离就是与 nums 拥有相同大小的度的最短连续子数组,因为这个子数组保证涵盖到所有的出现次数最多的元素,拥有相同大小的度。
两个hashmap分别记录每个数字出现的次数和第一次出现的位置,用来维护出现频数和所能产生的子数组长度
代码
class Solution {
public int findShortestSubArray(int[] nums) {
int max=-1,res=Integer.MAX_VALUE;
Map<Integer,Integer> map=new HashMap<>();
Map<Integer,Integer> map2=new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
if(!map2.containsKey(nums[i])) map2.put(nums[i],i);int temp= i-map2.get(nums[i])+1;
if(max==-1||map.get(nums[i])>map.get(max)||nums[i]==max||(map.get(nums[i])==map.get(max)&&temp<res))
//需要替换子数组的4种情况 1.最大频数还没初始化2.出现更大频数3.目前最大频数元素的子数组长度更新4.新元素的频数跟之前的最大频数相同,但是生成的子数组长度更短
{
res=temp; max=nums[i];
}
}
return res;
}
}
标签:map,697,nums,int,max,get,数组,leetcode,hashmap 来源: https://blog.csdn.net/weixin_44560620/article/details/113879696