此博客链接: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; } }
结果