题目链接:
https://leetcode-cn.com/problems/degree-of-an-array/
目标:
- 计算一个无须数组的度,并求出连续子集满足度不变的子集的最短长度
算法描述:
- 用三个hashmap,也就是三个key-value对,分别记录数组中每个元素出现的初始位置、结束位置、出现的次数
- 用collections.max来找出度
- 定义一个长度small_len初始化为数组长度,在遍历map中的key的过程中更新small_len
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class DegreeOfArray {
public static void main(String[] args) {
int nums[] = {1,2,2,3,1};
int nums1[] = {1,2,2,3,1,4,2};
int degree_small_length;
degree_small_length = findShortestSubArray(nums);
System.out.println(degree_small_length);
degree_small_length = findShortestSubArray(nums1);
System.out.println(degree_small_length);
}
public static int findShortestSubArray(int[] nums) {
//1.left、right、count
int length = nums.length;
int degree;
int degree_small_length = length;
Map<Integer,Integer> left = new HashMap<>(),right = new HashMap<>(),count = new HashMap<>();
//2.更新这三个map
for (int i=0;i<length;i++){
int x = nums[i];
if (left.get(x)==null){
left.put(x,i);
}
right.put(x,i);
count.put(x,count.getOrDefault(x,0)+1);
}
degree = Collections.max(count.values());
//3.只需要考虑count中的key
for (int x:count.keySet()){
if (count.get(x)==degree){
degree_small_length = Math.min(degree_small_length,right.get(x)-left.get(x)+1);
}
}
return degree_small_length;
}
}
测试结果:
2
6