public class case3_哪个数字超过了一半 {
public static void main(String[] args) {
int[] arr = new int[]{0, 1, 5, 6, 5, 2, 5, 5, 5};
// 第三种
int i2 = case3_第k小个数.selectKey(arr, 0, arr.length - 1, arr.length / 2);
System.out.println(i2);
int i = f4(arr);
System.out.println(i);
}
/**
* 哪个数字超过了一半
* 1,先排序,除以二中间的那个数字就是
* 2.hash 每次数字记录次数
* 3.顺序排序 selectkey 中间的那个元素就是超过一半的数字
* 4.消除法 先选一个候选值,和每一个进行消除,相同的次数加一,不同减一
*/
static void f1(int[] arr) {
Arrays.sort(arr);
System.out.println(arr[arr.length / 2]);
}
static void f2(int[] arr) {
Map<Integer, Integer> map = new HashMap<>();
int count = 1;
for (int i = 0; i < arr.length; i++) {
if (map.containsKey(arr[i])) {
map.put(arr[i], count++);
} else {
map.put(arr[i], 1);
}
if (map.get(arr[i]) >= arr.length / 2) {
System.out.println(arr[i]);
}
}
}
static int f4(int[] arr) {
int candidate = arr[0]; // 候选值
int times = 1;//记录次数
for (int i = 1; i < arr.length; i++) {
if (times == 0) {
//两两相消为0,把这次的作为候选值,次数重置为1
candidate = arr[i];
times = 1;
continue;
}
if (candidate == arr[i]) {
times++;
} else {
times--;
}
}
return candidate;
}
}