Given a non-empty array of non-negative integers nums
, the degree of this array is defined as the maximum frequency of any one of its elements.
Your task is to find the smallest possible length of a (contiguous) subarray of nums
, that has the same degree as nums
.
Example 1:
Input: [1, 2, 2, 3, 1] Output: 2 Explanation: The input array has a degree of 2 because both elements 1 and 2 appear twice. Of the subarrays that have the same degree: [1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2] The shortest length is 2. So return 2.
Example 2:
Input: [1,2,2,3,1,4,2] Output: 6
给定非空整数nums的非空数组,该数组的度数被定义为其任何一个元素的最大频率。
你的任务是找到num的(连续的)子阵列的最小可能长度,其与nums具有相同的度数。
例1:
输入:[1,2,2,3,1]
输出:2
说明:
输入数组的度数为2,因为元素1和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:
输入:[1,2,2,3,1,4,2]
输出:6
class Solution {
public int findShortestSubArray(int[] nums) {
int maxcount=1;
HashMap<Integer,Integer> hm=new HashMap<Integer,Integer>();
for(int i:nums)
{
if(hm.containsKey(i))
{
hm.put(i,hm.get(i)+1);
if(maxcount<hm.get(i))
{
maxcount=hm.get(i);
}
}
else
{
hm.put(i,1);
}
}
Set<Integer> set=hm.keySet();
int minlength=Integer.MAX_VALUE;
for(int s:set)
{
int temp=Integer.MAX_VALUE;
if(hm.get(s)==maxcount)
{
int i=0,j=nums.length-1;
while(nums[i]!=s&&i<j)
i++;
while(nums[j]!=s&&i<j)
j--;
temp=j-i+1;
}
minlength=Math.min(temp,minlength);
}
return minlength;
}
}