时间轴

2025-09-29

init


题目:

排序后直接返回中间那个元素就行

1
2
3
4
5
6
7
8
9
10
11
12
#include <algorithm>
#include <vector>

using std::vector;

class Solution {
public:
int majorityElement(vector<int> &nums) {
sort(nums.begin(), nums.end());
return nums[nums.size() / 2];
}
};

一个简单事实:如果一个数组有大于一半的数相同,那么任意删去两个不同的数字,新数组还是会有相同的性质。基于这个事实,就引发了类似相消的思想:

由于众数一定占数组大小的一半以上,所以就算其它所有元素都来和它“碰”,到最后还是剩下众数,cur表示目前遍历到的候选众数,count表示目前为止该众数的“净”计数(对于待选众数,遇到相同的就++,遇到不同的就“碰撞”–,如果count变成0,就重新设置候选众数,count从1开始)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
int majorityElement(vector<int>& nums) {
int i, n = nums.size();

int candidate = nums[0];
int cnt = 1;

for(i = 1 ; i < n; i++){
if(candidate == nums[i]){
cnt ++;
}else{
cnt --;
if(cnt == 0){
candidate = nums[i];
cnt = 1;
}
}
}
return candidate;

}
};

leetcode hot 100 rewrite, 从 0 开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <vector>
using std::vector;

class Solution {
public:
int majorityElement(vector<int> &nums)
{
int i, n = nums.size();
int target = nums[0], cnt = 0;

for (i = 0; i < n; i++) {
if (nums[i] == target) {
cnt++;
} else {
cnt--;
if (cnt == 0 && i != n - 1)
target = nums[i + 1];
}
}

return target;
}
};