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; } }
其中的
是能带改变map里的value的值的。。int[] temp = map.get(nums[i]); temp[0]++; temp[2] = i;