其他分享
首页 > 其他分享> > 697. 数组的度

697. 数组的度

作者:互联网

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.


注解见下面:


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;
    }
}

 

标签:firstMap,HashMap,nums,int,数组,new,697
来源: https://blog.csdn.net/weixin_45434902/article/details/117286464