题目地址:
https://leetcode.com/problems/degree-of-an-array/
给定一个数组 A A A,求其一个子数组的长度,该子数组包含了某个在 A A A中出现的最多次数的数(该数字要全包括进去)。返回满足条件的最短子数组的长度。
思路是哈希表。开两个哈希表,一个用来数一下每个数出现了多少次,另一个用来记录每个数出现的第一次的位置和最后一次的位置。然后找到出现次数最多的数有哪些,找到之后,算一下这些数出现的第一次和最后一次的位置之差加 1 1 1即可。代码如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Solution {
public int findShortestSubArray(int[] nums) {
Map<Integer, Integer> count = new HashMap<>();
Map<Integer, int[]> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
count.put(nums[i], count.getOrDefault(nums[i], 0) + 1);
// 第一次遇到该数,new一个长度2的数组进去;否则更新右端点
if (!map.containsKey(nums[i])) {
map.put(nums[i], new int[]{i, i});
} else {
map.get(nums[i])[1] = i;
}
}
int deg = 0;
List<Integer> list = new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : count.entrySet()) {
int key = entry.getKey(), val = entry.getValue();
if (val > deg) {
deg = val;
list.clear();
list.add(key);
} else if (val == deg) {
list.add(key);
}
}
int res = nums.length;
for (int num : list) {
int[] idx = map.get(num);
res = Math.min(res, idx[1] - idx[0] + 1);
}
return res;
}
}
时空复杂度 O ( n ) O(n) O(n)。