数组的度

此博客链接:https://www.cnblogs.com/ping2yingshi/p/14422550.html

数组的度

题目链接:https://leetcode-cn.com/problems/degree-of-an-array/submissions/

题目

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

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

题解

利用哈希把相同数组的下标存到value中,然后统计value中最大的值,最后用最大value中最后一个下标减去第一个下标。

代码

 

class Solution {
    public int findShortestSubArray(int[] nums) {
         Map<Integer,ArrayList> map=new HashMap();
         for(int i=0;i<nums.length;i++){
             ArrayList<Integer> list=new ArrayList();
             if(map.get(nums[i])==null)//map中不存在元素,则创建列表
             {
                  list.add(i);
                  map.put(nums[i],list);
             }
             else{
                 map.get(nums[i]).add(i);
             }
         }
            //  int ans[]=new int [map.size()];
             int max=0;
            //  int k=0;
             for(int temp:map.keySet())
             {
                 max=Math.max(max,map.get(temp).size());
                //  ArrayList list=map.get(temp);
                //  ans[k++]=list[temp.size()-1]-list.get[0];
             }
             int count=1000000;
             for(int temp:map.keySet())
             {
                 if(max==map.get(temp).size()){
                    ArrayList<Integer> list=map.get(temp);
                    int last = list.get(new Integer(list.size()-1));
                    int first = list.get(0);
                    // System.out.print("last:"+last+"first:"+first);
                    count=Math.min(count,last - first+1);
                 }
             }
         return count;
    }
}

 

结果

 

 

posted @ 2021-02-20 17:54  萍2樱释  阅读(65)  评论(0编辑  收藏  举报