今天是不会哈希表的一天,看了题解都好半天才弄明白

    1. public int findShortestSubArray(int[] nums) {
    2. //创建一个int的哈希表
    3. Map<Integer, int[]> map = new HashMap<Integer, int[]>();
    4. int n = nums.length;
    5. for (int i = 0; i < n; i++) {
    6. //如果哈希表的key中已经有了nums[i]的值
    7. if (map.containsKey(nums[i])) {
    8. //该值出现的次数加一
    9. map.get(nums[i])[0]++;
    10. //记录该值最后出现的位置
    11. map.get(nums[i])[2] = i;
    12. } else {
    13. //若之前key中没有nums[i],添加到key中并初始化
    14. map.put(nums[i], new int[]{1, i, i});
    15. }
    16. }
    17. int maxNum = 0, minLen = 0;
    18. for (Map.Entry<Integer, int[]> entry : map.entrySet()) {
    19. int[] arr = entry.getValue();
    20. if (maxNum < arr[0]) {
    21. maxNum = arr[0];
    22. minLen = arr[2] - arr[1] + 1;
    23. } else if (maxNum == arr[0]) {
    24. if (minLen > arr[2] - arr[1] + 1) {
    25. minLen = arr[2] - arr[1] + 1;
    26. }
    27. }
    28. }
    29. return minLen;
    30. }

    记原数组中出现次数最多的数为 xx,那么和原数组的度相同的最短连续子数组,必然包含了原数组中的全部 xx,且两端恰为 xx 第一次出现和最后一次出现的位置。

    因为符合条件的 xx 可能有多个,即多个不同的数在原数组中出现次数相同。所以为了找到这个子数组,我们需要统计每一个数出现的次数,同时还需要统计每一个数第一次出现和最后一次出现的位置。

    在实际代码中,我们使用哈希表实现该功能,每一个数映射到一个长度为 33 的数组,数组中的三个元素分别代表这个数出现的次数、这个数在原数组中第一次出现的位置和这个数在原数组中最后一次出现的位置。当我们记录完所有信息后,我们需要遍历该哈希表,找到元素出现次数最多,且前后位置差最小的数。