1. leetCode
–697数组的度
- 题目连接:https://leetcode-cn.com/problems/degree-of-an-array
- 题目类型: 简单数组
1.1 问题描述
给定一个非空且只包含非负数的整数数组 nums,
数组的度的定义是指数组里任一元素出现频数的最大值。
你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
示例 1:
输入: [1, 2, 2, 3, 1] 输出: 2 解释: 输入数组的度是2,因为元素1和2的出现频数最大,均为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,所以返回2.
示例 2:
输入: [1,2,2,3,1,4,2] 输出: 6
注意:
nums.length 在1到50,000区间范围内。 nums[i] 是一个在0到49,999范围内的整数。
1.2 问题分析
- 利用
HashMap
把我们需要的三种数据进行封装:
- 用来存放nums数组中每个数出现的次数
countMap
- **
countMap.getOrDefault(key,defaulValue)
**当Map集合中有这个key时,就使用这个key值,如果没有就使用默认值defaultValue
- 每个value用来存放首次出现的位置
keyFirst
- 每个value末尾出现的位置
keyLast
- 然后获得该数组的度
arrDegree
- 最后遍历数组,找到
countMap
中key对应value==arrDegree
的key通过keyFirst
和keyLast
找到最终的result。
1.3 代码实现
public static int findShortestSubArray(int[] nums) {
// 用来存放nums数组中每个数出现的次数
Map<Integer,Integer> countMap = new HashMap<>();
// 每个value首次出现的位置
Map<Integer,Integer> keyFirst = new HashMap<>();
// 每个value末尾出现的位置
Map<Integer,Integer> keyLast = new HashMap<>();
// 遍历数组
for (int i = 0; i < nums.length; i++) {
int temp = nums[i];
// 如果countMap中不存在temp,value=1;
// 如果countMap中存在temp,value = value + 1;
countMap.put(temp,countMap.getOrDefault(temp,0)+1);
// 遍历到最后就变成了每个数字的最后一位的下标
keyLast.put(temp,i);
// 每个数字的第一位的下标
if(!keyFirst.containsKey(temp)){
keyFirst.put(temp,i);
}
}
// 得到该数组的度--遍历countMap得到
int arrDegree = 0;
for (int i = 0; i < nums.length; i++) {
arrDegree = Math.max(arrDegree, countMap.get(nums[i]));
}
// 遍历数组
int result = nums.length;
for (int i = 0; i < nums.length; i++) {
int temp = nums[i];
int count = countMap.get(temp);
// 不满足的值
if (count != arrDegree) {
continue;
}
result = Math.min(result, keyLast.get(temp) - keyFirst.get(temp) + 1);
}
return result;
}
1.4 测试代码
/**
* @Date 2020/5/14 17:33
* @Version 10.21
* @Author DuanChaojie
*/
public class FindShortestSubArray {
public static void main(String[] args) {
int[] nums = new int[]{1,2,2,3,1,8};
int shortestSubArray = findShortestSubArray(nums);
System.out.println("shortestSubArray = " + shortestSubArray);
}
}
1.5 结果分析
执行结果:
- 执行用时 :25 ms, 在所有 Java 提交中击败了83.62%的用户
- 内存消耗 :42.7 MB, 在所有 Java 提交中击败了6.25%的用户