• leetcode 697. Degree of an Array 数组的度(简单)


    一、题目大意

    https://leetcode.cn/problems/degree-of-an-array

    给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。

    你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。

    示例 1:

    输入: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 。

    示例 2:

    输入:nums = [1,2,2,3,1,4,2]
    输出:6
    解释:
    数组的度是 3 ,因为元素 2 重复出现 3 次。
    所以 [2,2,3,1,4,2] 是最短子数组,因此返回 6 。

    提示:

    • nums.length 在 1 到 50,000 范围内。
    • nums[i] 是一个在 0 到 49,999 范围内的整数。

    二、解题思路

    首先给数组的度下一个定义,给一个数组,某个或某些数字出现最多的次数为该数组的度。题目要求我们找到最短的子数组使其和原数组拥有相同的度。

    思路:统计每个数字出现的次数,用哈希来建立数字与出现次数的映射,我们要求与该数组有相同度的最小长度子数组,我们要知道每个数字的度,与其首次出现的位置,这样我们要定义两个哈希一个来存出现的次数,一个来存首次出现的位置。我们再定义一个变量degree来表示数组的度。遍历数组当前遍历位置可以看作是最后一次出现的位置即尾位置,累加当前数字出现的次数,如果数字是第一次出现,建立数字与首位置的映射,如果当前数字的出现次数等于degree时,当前位置为尾位置,用endIndex - startIndex + 1来更新结果;如果当前数字的出现次数大于degree,说明之前的结果代表的数字不是出现最多的,直接将结果更新为endIndex - startIndex + 1,然后degree也更新为当前数字出现的次数。

    三、解题方法

    3.1 Java实现

    public class Solution {
        public int findShortestSubArray(int[] nums) {
            Map<Integer, Integer> countMap = new HashMap<>();
            Map<Integer, Integer> firstIdxMap = new HashMap<>();
            int ans = nums.length;
            int degree = 0;
            for (int i = 0; i < nums.length; i++) {
                int num = nums[i];
                countMap.put(num, countMap.getOrDefault(num, 0) + 1);
                // 记录首位置
                if (countMap.get(num) == 1) {
                    firstIdxMap.put(num, i);
                }
    
                if (countMap.get(num) == degree) {
                    ans = Math.min(ans, i - firstIdxMap.get(num) + 1);
                } else if (countMap.get(num) > degree) {
                    ans = i - firstIdxMap.get(num) + 1;
                    degree = countMap.get(num);
                }
            }
            return ans;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    四、总结小记

    • 2208/8/23 这两天天气不错
  • 相关阅读:
    【操作系统】聊聊文件系统是如何工作的
    springboot依赖管理
    ConcurrentHashMap
    国内的聚宽量化平台好不好用?
    什么是ConcurrentHashMap?
    RabbitMQ快速上手及讲解
    SpringBoot 常用注解的原理和使用
    frida动态插桩初探
    简单的股票行情演示(一) - 实时标的数据
    P1151 子数整数
  • 原文地址:https://blog.csdn.net/ln_ydc/article/details/126492148