题目
给定一个整形数组arr,再给定一个整数K,打印所有出现次数大于N/K的数,如果没有这样的数,打印提示信息。
首先分析K=2这个特殊情况,有以下思路:
-
排序后,取数组中间的数。但该方法的时间复杂度为排序算法的时间复杂度O(NlogN)。
-
一次在数组中删掉两个不同的数,不停地删除,直到剩下的数只有一种,一定是那个出现次数大于一半的数。
实现代码:
/** * 特例:找出出现次数大于一半的数 * * @param arr 待查数组 */ public void printHalfMajor (int[] arr) { int cand = 0; //候选 int times = 0; //次数 for (int i = 0; i != arr.length; i++) { if (times == 0) { cand = arr[i]; times = 1; } else if (arr[i] == cand) { times++; } else { times--; } } times = 0; for (int i = 0; i != arr.length; i++) { if (arr[i] == cand) { times++; }