数学
# 39. 数组中出现次数超过一半的数字
NowCoder(opens new window) (opens new window)
# 解题思路
想象一下,如果把这些数字当做人种,一个数字和另外一个数字打了起来,同归于尽。最后剩下的是不是人数最多的那种人。这里要满足一个条件:某类人的数目一定要大于总人数的一半。
算法步骤:我们选择输入数组中第一个元素作为候选元素candidate,并设置其出现次数为count=1。随后遍历数组。当遇到与candidate相同的元素,count+1;不同的元素,count-1。当count为0的时候,选择下一个元素为候选元素,并且置count=1。遍历到数组的最后,剩下的candidate就是要求的结果。
int MoreThanHalfNum_Solution(vector<int> &numbers) {
int candidate = numbers[0];
int count = 1;
for (int i = 1; i < numbers.size(); i++) {
if (numbers[i] == candidate) {
count++;
} else {
count--;
}
if (count == 0) {
candidate = numbers[i + 1];
count++;
}
}
return candidate;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
编辑 (opens new window)
上次更新: 2023/02/17, 17:03:51