其他分享
首页 > 其他分享> > leetcode 697. 数组的度(hashmap)

leetcode 697. 数组的度(hashmap)

作者:互联网

给定一个非空且只包含非负数的整数数组 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.

解题思路

关键找到出现次数最多的元素(可能多个),相同元素的头尾元素的距离就是与 nums 拥有相同大小的度的最短连续子数组,因为这个子数组保证涵盖到所有的出现次数最多的元素,拥有相同大小的度。
两个hashmap分别记录每个数字出现的次数和第一次出现的位置,用来维护出现频数和所能产生的子数组长度

代码

class Solution {
    public int findShortestSubArray(int[] nums) {

        int max=-1,res=Integer.MAX_VALUE;
        Map<Integer,Integer> map=new HashMap<>();
        Map<Integer,Integer> map2=new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i],map.getOrDefault(nums[i],0)+1);
            if(!map2.containsKey(nums[i])) map2.put(nums[i],i);int temp= i-map2.get(nums[i])+1;
            if(max==-1||map.get(nums[i])>map.get(max)||nums[i]==max||(map.get(nums[i])==map.get(max)&&temp<res))
//需要替换子数组的4种情况 1.最大频数还没初始化2.出现更大频数3.目前最大频数元素的子数组长度更新4.新元素的频数跟之前的最大频数相同,但是生成的子数组长度更短
            {
                res=temp; max=nums[i];

            }
        }
        return res;
    }
}

标签:map,697,nums,int,max,get,数组,leetcode,hashmap
来源: https://blog.csdn.net/weixin_44560620/article/details/113879696