题目:
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
Note:
-
nums.length
will be between 1 and 50,000. -
nums[i]
will be an integer between 0 and 49,999.
分析:
class Solution { public int findShortestSubArray(int[] nums) { //给定非空数组,其中字串中的度的定义:数组中出现频率最高的数字 //找出其中最小的连续子串,该子串包含度的任何一个数字(即必须至少有一种度的所有元素在其中) //思路:第一步:找出度的数。第二步,超出每个度的起始位置。最后起始位置最小的便是结果。 //找出最大值 int maxNum=Integer.MIN_VALUE; for(int n:nums){ if(n>maxNum) maxNum=n; } //采用一行三列数组来记录,出现次数和首末位置下标 int [][] count=new int[maxNum+1][3]; int max=0; for(int i=0;i<nums.length;i++){ if(count[nums[i]][0]==0){ //第一次出现,记录起始下标 count[nums[i]][1]=i; } //更新末尾下标 count[nums[i]][2]=i; count[nums[i]][0]++; max=Math.max(max,count[nums[i]][0]); } //查找相同频率的元素 HashSet<Integer> set=new HashSet<Integer>(); //maxNum为了少判断一些数 for(int i=0;i<=maxNum;i++){ if(count[i][0]==max){ set.add(i); } } //将最小间距的输出 int min=nums.length; for(int index:set){ min=Math.min(min,count[index][2]-count[index][1]+1); } return min; } }