出现次数大于n/2的元素个数
解题思路
这是一个查找主要元素(众数)的问题。需要找出数组中出现次数超过一半的数字。可以使用摩尔投票算法。
关键点:
使用摩尔投票算法
不需要额外空间统计频次
保证一定存在答案
处理计数过程
算法步骤:
初始化候选数和计数器
遍历数组进行投票
返回最终的候选数
代码
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int solve(vector<int>& nums) {
// 摩尔投票算法
int candidate = nums[0];
int count = 1;
// 投票过程
for (int i = 1; i < nums.size(); i++) {
if (count == 0) {
candidate = nums[i];
count = 1;
} else if (nums[i] == candidate) {
count++;
} else {
count--;
}
}
return candidate;
}
};
int main() {
vector<int> nums;
int num;
// 读取输入
while (cin >> num) {
nums.push_back(num);
}
Solution solution;
cout << solution.solve(nums) << endl;
return 0;
}
算法及复杂度
算法:摩尔投票算法
时间复杂度:
𝑂
(
𝑛
)
O(n),只需遍历一次数组
空间复杂度:
𝑂
(
1
)
O(1),只需要常数级额外空间
作者:重生之我要当分子
链接:https://www.nowcoder.com/discuss/704688716471701504
来源:牛客网