- 问题
–
- 分析
–
- 源码
//a存放知识点,P存放知识点个数
int solve(int[] a, int P) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Set<Integer> set = new HashSet<Integer>();
for (int i : a) {
set.add(i);
}
//计算知识点的个数(不包括重复的)
int num = set.size();
int f = 0, l = 0;
int cnt = 0, min = Integer.MAX_VALUE;
while(true) {
while(l<P && cnt<num) {
//出现新知识点
if(!map.containsKey(a[l]) || map.get(a[l])==0) {
map.put(a[l], 1);
cnt++;
} else {
//更新旧知识点出现的个数
map.put(a[l], map.get(a[l])+1);
}
//下标往前移动
l++;
}
if(cnt < num)
break;
//刷新区间差的最小值
min = Math.min(min, l-f);
//从区间头部开始扫描,不断对知识点的个数减一
map.put(a[f], map.get(a[f])-1);
//如果个数为零表明该知识点只有一个
if(map.get(a[f])==0) {
cnt--;
}
//下标往前移动
f++;
}
return min;
}