LeetCode第四天(697. 数组的度)

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

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

刚开始题目都不太能读懂,写不出来,然后去B站寻找了一下教学视频(up主讲的是真的很细致!!!)这是分开一步步写的,官解是步骤跨越显得有点难(因为我是菜狗)

java 复制代码
class Solution {
    public int findShortestSubArray(int[] nums) {

        //思路:遍历数组nums,将每个元素出现的次数存在HashMap中,得到数组的度
        //最短连续子数组要和nums数组度的大小相同,就要包含出现次数最多的元素的首位置、末位置
        //如果有多个出现次数最大的元素,就比较末位置-首位置最小的数组长度(遍历HashMap)

        //key存储元素,value存储元素出现次数、首位、末位
        Map<Integer,int[]> map = new HashMap<>();

        //定义数组的度
        int maxCount = 0;
        //定义数组长度
        int len = nums.length;
        //遍历数组,找出度,首位,末位
        for(int i = 0;i < len;i++){
            int num = nums[i];
            if(map.containsKey(num)){
                //元素不是第一次出现
                int[] data = map.get(num);
                //更新次数
                data[0] = data[0] + 1;
                //更新末位
                data[2] = i; 
                //更新数组的度
                maxCount = Math.max(maxCount,data[0]);
            }else{
                //元素是第一次出现
                int[] data = new int[3];
                data[0] = 1;
                data[1] = i;
                data[2] = i;
                map.put(num,data);
                //更新数组的度
                maxCount = Math.max(maxCount,data[0]);
                
            }
        }

        //定义首位末位差值
        int diff = len;
        //得到map里面的int[]数组
        Set<Integer> KeySet = map.keySet();
        //遍历HashMap
        for(Integer num : KeySet){
            int[] data = map.get(num);
            //如果该元素的出现次数=数组的度,计算首末位置的差值,把最小的数组长度赋值给diff
            if(data[0] == maxCount){
                diff = Math.min(diff,data[2]-data[1]+1);
            }
        }
        return diff;
    }
}

官解:

方法一:哈希表

思路及解法

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

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

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

java 复制代码
class Solution {
    public int findShortestSubArray(int[] nums) {
        Map<Integer, int[]> map = new HashMap<Integer, int[]>();
        int n = nums.length;
        for (int i = 0; i < n; 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;
        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;
    }
}
相关推荐
尘心cx3 分钟前
数据结构-栈
数据结构
学无止境\n7 分钟前
[C语言]指针和数组
c语言·数据结构·算法
黄俊懿11 分钟前
【深入理解SpringCloud微服务】手写实现各种限流算法——固定时间窗、滑动时间窗、令牌桶算法、漏桶算法
java·后端·算法·spring cloud·微服务·架构
新缸中之脑11 分钟前
Llama 3.2 安卓手机安装教程
前端·人工智能·算法
夜雨翦春韭31 分钟前
【代码随想录Day29】贪心算法Part03
java·数据结构·算法·leetcode·贪心算法
Curry_Math1 小时前
Acwing 区间DP & 计数类DP
算法
Tisfy1 小时前
LeetCode 1928.规定时间内到达终点的最小花费:动态规划
算法·leetcode·动态规划·
ん贤1 小时前
贪心算法.
算法·贪心算法
cndes1 小时前
大数据算法的思维
大数据·算法·支持向量机
Mopes__3 小时前
Python | Leetcode Python题解之第461题汉明距离
python·leetcode·题解