题目
小明拿到了一个数列a1 , a2 , ... an ,小明想知道存在多少个区间[l,r]同时满足下列两个条件:
1、r-l+1=k;
2、在a l , a l+1,...ar中,存在一个数至少出现了 t 次。
输出满足条件的区间个数。
思路:
先判断n和k的关系,若k>n,直接返回0,若k<n,再进行后续计算
设置Map<Integer,Integer>,保存数列中值出现次数
设置count,保存ar-al中出现t次及以上数的个数
设置num,保存区间数
首先从0到n-k-1遍历一遍,对lst、count、num进行初始化
然后将窗口向右滑动,每次从头去一个,从尾部添加一个,动态维护lst、count、num的值。
代码
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
public class Meituan2 {
public static int t;
public static int res;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//n个数
int k = sc.nextInt();//区间长度
t = sc.nextInt();//出现次数
int[] arr = new int[n];
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
//计数,0到k内,数字的重复次数
res = 0;
for(int i=0;i<k;i++){
arr[i] = sc.nextInt();
count(map,arr[i]);
}
//0到k内是否有重复次数大于2的值,有res+1
check(map);
//k到n
for(int i=k;i<n;i++){
count(map,arr[i]);
map.put(arr[i-k], (int) map.get(arr[i-k])-1);
check(map);
}
System.out.println(res);
}
private static void count(Map<Integer, Integer> map,int n) {
int value=0;
try{
value = (int)map.get(n);//有值则取,为空则为0
}catch(Exception e){
}finally{
map.put(n, value+1);
}
}
//检查此区间里map中是否有满足条件的
private static void check(Map<Integer, Integer> map) {
Iterator<Integer> it2 = map.values().iterator();
while (it2.hasNext()) {
int value = it2.next();
if(value>=t){
res++;
break;
}
}
}
}
总结
map存取时需注意,捕获异常