leetcode-697. Degree of an Array
697. Degree of an Array
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.
思路:
肯定很容易想到 先找到数组里出现次数最多的数,在用最后一次出现的位置减去第一次出现的位置,还要考虑到又出现频率一样的数,怎么计算度,问题就是怎么组织数据来实现
一开始我也想到这方法,但是却不知道怎么组织数据,一开始用数组来存元素的次数,用数组来计算度,但是遇到次数一致的就无法解决。而且用数组来存次数也需要开一个很大的数组也考虑了用map
后来看了discuss,思路是一样的,但是用的map<Integer,int[]>,自己没想到
class Solution {
public int findShortestSubArray(int[] nums) {
if (nums.length == 0 || nums == null) return 0;
Map<Integer, int[]> map = new HashMap<>();
for (int i = 0; i < nums.length; i++){
if (!map.containsKey(nums[i])){
map.put(nums[i], new int[]{1, i, i}); // the first element in array is degree, second is first index of this key, third is last index of this key
} else {
int[] temp = map.get(nums[i]);
temp[0]++;
temp[2] = i;
}
}
int degree = Integer.MIN_VALUE, res = Integer.MAX_VALUE;
for (int[] value : map.values()){
if (value[0] > degree){
degree = value[0];
res = value[2] - value[1] + 1;
} else if (value[0] == degree){
res = Math.min( value[2] - value[1] + 1, res);
}
}
return res;
}
}其中的
int[] temp = map.get(nums[i]);
temp[0]++;
temp[2] = i;是能带改变map里的value的值的。。
浙公网安备 33010602011771号