前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >697. 数组的度

697. 数组的度

作者头像
CaesarChang张旭
发布2021-06-01 22:15:01
2800
发布2021-06-01 22:15:01
举报
文章被收录于专栏:悟道

697. 数组的度

给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 示例 1: 输入:[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.


注解见下面:


代码语言:javascript
复制
class Solution {
    public int findShortestSubArray(int[] nums) {
        //记录出现多少次的hash
        Map<Integer,Integer> countMap=new HashMap();
        //记录一开始这个key的出现位置的 hash 
        Map<Integer,Integer> firstMap=new HashMap();
        //记录最后这个key的出现位置的 hash 
        Map<Integer,Integer> lastMap=new HashMap();
        //定义最大值,最小值
        int max=0;
        int min=Integer.MAX_VALUE;
        //更新最大值,找出最大度,同时记录第一次出现位置,最后一次出现位置
        for(int i=0;i<nums.length;i++){
            countMap.put(nums[i],countMap.getOrDefault(nums[i],0)+1);
            if(countMap.get(nums[i])>max){
                max=countMap.get(nums[i]);
            }
            if(!firstMap.containsKey(nums[i])){
                firstMap.put(nums[i],i);
            }
            lastMap.put(nums[i],i);
        }

        //分析度这个元素第一次出现的位置和最后一次出现的位置
        for(int i=0;i<nums.length;i++){ //因为可能有好多元素对应这个最大度,所以要循环遍历每一个元素
            //找到最大度 对应的key值
            if(max==countMap.get(nums[i])){
              
                //更新最小值
                min=Math.min(lastMap.get(nums[i])-firstMap.get(nums[i])+1,min);
            }
        }
        return min;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档