区间统计

题目

小明拿到了一个数列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存取时需注意,捕获异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值