数组的度

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

你的任务是找到与 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.

输入:[1,2,2,3,1,4,2]输出:6

本题可以通过利用三个hashmap解决,其中map用来存储元素出现频数,leftindex用来存储每个元素的最左出现位置,rightindex用于存储每个元素的最右出现位置,之后初始化max并遍历map,若当前元素出现次数大于max,则将max更新为当前元素出现次数并将最小长度更新为当前元素右边界-左边界,若当前元素出现次数等于max,判断当前元素跨越范围与最小长度的大小,若小于最小长度,则将最小长度更新为当前元素跨越的范围。

public int findShortestSubArray(int[] nums) {

        HashMap<Integer,Integer> map=new HashMap(),leftindex=new HashMap(),rightindex=new HashMap();

        //初始化三个hashmap

        for(int i=0;i<nums.length;i++){

            map.put(nums[i],map.getOrDefault(nums[i],0)+1);

            if(!leftindex.containsKey(nums[i]))

               leftindex.put(nums[i],i);

            rightindex.put(nums[i],i);

        }

        int max=0;

        int ans=0;

        int num=0;

        for(Map.Entry<Integer,Integer> entry:map.entrySet())

        {

            if(entry.getValue()>max)

            {

                max=entry.getValue();

                num=entry.getKey();

                ans=rightindex.get(num)-leftindex.get(num)+1;

            }

            if(entry.getValue()==max)

            {

                num=entry.getKey();

                if(rightindex.get(num)-leftindex.get(num)<ans)

                   ans=rightindex.get(num)-leftindex.get(num)+1;

            }

        }

        return ans;

    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容