CCF 201409-1 相邻数对
Java实现
问题链接-> 相邻数对
问题描述:
给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差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); }
-
结果
-
-
还是用数组存储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); }
结果:
-
除了用数组存储外,还可以使用
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); }
结果: