-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathcandidate.html
More file actions
59 lines (54 loc) · 1.58 KB
/
candidate.html
File metadata and controls
59 lines (54 loc) · 1.58 KB
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>多数问题</title>
</head>
<body>
<h1>多数问题</h1>
<p>定义:一个元素个数为n的数组,希望快速找出其中大于出现次数>n/2的元素(该元素也称为多数元素)。通常可用于选票系统,快速判定某个候选人的票数是否过半</p>
<p>思路:在原序列中去除两个不同的元素后,那么在原序列中的多数元素在新序列中还是多数元素</p>
<p>案例:数列3, 2, 3, 1, 3, 3, 2, 3中,3就是个数大于总数一半的元素</p>
<script type="text/javascript">
//找出数组A中“可能存在”的多数元素
function candidate(A, m) {
var count = 1,
c = A[m],
n = A.length - 1;
while (m < n && count > 0) {
m++;
if (A[m] == c) {
count++;
} else {
count--;
}
}
if (m == n) {
return c;
} else {
return candidate(A, m + 1);
}
}
//寻找多数元素
//时间复杂度O(n)
function majority(A) {
var c = candidate(A, 0);
var count = 0;
//找出的c,可能是多数元素,也可能不是,
//必须再数一遍,以确保结果正确
for (var i = 0; i < A.length; i++) {
if (A[i] == c) {
count++;
}
}
//如果过半,则确定为多数元素
if (count > Math.floor(A.length / 2)) {
return c;
}
return null;
}
var m = majority([3, 2, 3, 1, 3, 3, 2, 3]);
document.write(m);
</script>
</body>
</html>