【题解】力扣697. 数组的度
697. 数组的度
题目来源
思路
使用哈希表
先遍历一遍数组,记录数组中数字出现的次数,第一次出现的位置,以及最后一次出现的位置。
因为符合条件的数字可能有多个,所以还要进行比较。
我们使用哈希表实现该功能,每一个数映射到一个长度为 3 的数组,数组中的三个元素分别代表这个数出现的次数、这个数在原数组中第一次出现的位置和这个数在原数组中最后一次出现的位置。当我们记录完所有信息后,我们需要遍历该哈希表,找到元素出现次数最多,且前后位置差最小的数。
代码
class Solution {
public int findShortestSubArray(int[] nums) {
int len = nums.length;
Map<Integer, int[]> map = new HashMap<Integer, int[]>();
// 遍历一遍数组,初始化map
for(int i = 0;i<len;i++){
if(map.containsKey(nums[i])){
map.get(nums[i])[0]++;
map.get(nums[i])[2] = i;
}
else{
map.put(nums[i], new int[]{1,i,i});
}
}
int maxNum = 0, minLen = 0;
// 遍历map
for(Map.Entry<Integer, int[]> entry : map.entrySet()){
int[] arr = entry.getValue();
if(maxNum < arr[0]){
maxNum = arr[0];
minLen = arr[2] - arr[1] + 1;
}
else if(maxNum == arr[0]){
if(minLen > arr[2] - arr[1] + 1){
minLen = arr[2] - arr[1] + 1;
}
}
}
return minLen;
}
}