问题: 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.
问题分析: 输入一个字符串,输出具有最多相同字符的子串的最短长度。
解题思路: 用哈希映射数据结构来解决问题,在键中存储数组元素,重新定义一个包含起始位置begin、长度length、与相同个数times的数据类型,用于值中。最后对值进行选取,先判断个数最多的值,其次再次数最多且相等的情况下,选择长度最短长度,即是所要的输出。
*class Solution {
public int findShortestSubArray(int[] nums) {
Map<Integer,Beginlength> map = new HashMap<Integer,Beginlength>();
int begin ;
int length = 0;
int times = 0;
for(int i = 0; i < nums.length;i++){
if(!map.containsKey(nums[i])){
begin = i;
length = 1;
times = 1;
}
else{
begin = map.get(nums[i]).begin;
times = ++ map.get(nums[i]).times;
length = i - begin + 1;
}
map.put(nums[i], new Beginlength(begin,length,times)); //传递实例化对象
}
int j = 0;
int time = 0;
for(Beginlength i:map.values()){
if(i.times > time){
time = i.times;
j = i.length;
}
else if(i.times == time){
j =(j>i.length)?i.length:j;
}
}
return j;
}
}
class Beginlength{
int begin ;
int length;
int times;
Beginlength(int begin, int length,int times){
this.begin = begin;
this.length = length;
this.times = times;
}
}
运行时间为49ms。