201409-1 相邻数对

CCF 201409-1 相邻数对

Java实现

问题链接-> 相邻数对

问题描述:

给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1

思路

  1. 暴力枚举

    • 用数组存储这n个数,然后遍历每个元素,检查其他元素与该元素是否相差1.时间复杂度是O(n2)

      public static void main(String[] args) {
      		Scanner sc = new Scanner(System.in);
      		
      		int n = sc.nextInt();
      		int[] arr = new int[n];
      		int count = 0;
          	// 读入n个数
      		for (int i = 0; i < arr.length; i++) {
      			arr[i] = sc.nextInt();
      		}
      		// 遍历
      		for (int i = 0; i < arr.length; i++) {
      			for (int j = i+1; j < arr.length; j++) {
      				int diff = Math.abs(arr[i] - arr[j]);
      				if (diff == 1) {
      					count++;
      				}
      			}
      		}
      		
      		System.out.println(count);
      	}
      
    • 结果

    在这里插入图片描述

  2. 还是用数组存储n个数.与思路一不同的是,我们先将这个数组排序,然后只需遍历一遍数组即可.时间复杂度是O(nlog2n)

    public static void main(String[] args) {
    	
    		Scanner scanner = new Scanner(System.in);
    		int n = scanner.nextInt();
    		int[] arr = new int[n];
    		
    		for (int i = 0; i < arr.length; i++) {
    			arr[i] = scanner.nextInt();
    		}
    		
    		Arrays.sort(arr); // 快排
    		int count = 0;
    		
    		for (int i = 0; i < arr.length-1; i++) {
    			int diff = Math.abs(arr[i] - arr[i+1]);
    			if (diff == 1) {
    				count++;
    			}
    		}
    		
    		System.out.println(count);
    	}
    

    结果:

  3. 除了用数组存储外,还可以使用HashMap.将键和值都存储为输入的数字,然后在录入n个数的同时,用containsKey()检查是否有相差1的键存在. 这个算法的时间复杂度有些特殊.当HashMap没有发生冲突的时候,containsKey()的时间复杂度是O(1);发生碰撞事件负责蜕变为O(n).所以,时间复杂度最优为O(n),最差为O(n2)

    public static void main(String[] args) {
    		HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    		Scanner scanner = new Scanner(System.in);
    		int n = scanner.nextInt();
    		int count = 0;
    		
    		for (int i = 0; i < n; i++) {
    			int temp = scanner.nextInt();
    			map.put(temp, temp);
    			
    			if (map.containsKey(temp - 1)) {
    				count++;
    			}	
    			if (map.containsKey(temp + 1)) {
    				count++;
    			}
    		}
    		
    		System.out.println(count);
    
    	}
    

    结果:

    在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值