数组中超过一半的数

原题 :(数组中超过一半(N/2)的数)

进阶 : 找到出现次数超过N/K的数

tips : 原题一个候选数 一次删2个 进阶题 一次k-1个候选数 一次删k个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public static void pirntKMajor(int[] arr, int k) {
if (k < 2) {
System.out.println("the value of k is invalid");
return;
}
HashMap<Integer, Integer> cands = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
if (cands.containsKey(arr[i])) {
cands.put(arr[i], cands.get(arr[i]) + 1);
} else {
if (cands.size() == k - 1) {
allCandsMinsusOne(cands);
} else {
cands.put(arr[i], 1);
}
}
}
HashMap<Integer, Integer> reals = getReals(arr, cands);

boolean print = false;
for (Map.Entry<Integer, Integer> set : reals.entrySet()) {
int value = set.getValue();
int key = set.getKey();
if (value > arr.length / k) {
print = true;
System.out.print(key + " ");
}
}
System.out.println(print ? "" : "no such number");
}

private static HashMap<Integer, Integer> getReals(int[] arr, HashMap<Integer, Integer> cands) {
HashMap<Integer, Integer> reals = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
if (cands.containsKey(arr[i])) {
if (reals.containsKey(arr[i])) {
reals.put(arr[i], reals.get(arr[i]) + 1);
} else {
reals.put(arr[i], 1);
}
}
}
return reals;
}

private static void allCandsMinsusOne(HashMap<Integer, Integer> map) {
List<Integer> removeList = new LinkedList<>();
for (Map.Entry<Integer, Integer> set : map.entrySet()) {
int key = set.getKey();
int value = set.getValue();
if (value == 1) {
removeList.add(key);
} else {
map.put(key, value - 1);
}
}
for (Integer removeKey : removeList) {
map.remove(removeKey);
}
}