九日集训(第五天)排序
三、课后习题
课后所有习题,在上文都能找到答案,所以务必全部刷完。
第五天了,有什么感觉吗?昨天的指针相比是吃下了,C语言的最难点已经告一段落了,接下来就享受刷题的狂欢吧。其实举办这个九日集训的目的,最终还是为了让大家养成习惯,习惯刷题并且爱上它,我相信,到了后面你自己也会忍不住自己找题来刷。坚持!加油!你可以的!
169. 多数元素
#include <vector>
#include <unordered_map>
class Solution {
public:
int majorityElement(std::vector<int>& nums) {
int count = 0;
int candidate = 0;
for (int num : nums) {
if (count == 0) {
candidate = num;
}
count += (num == candidate) ? 1 : -1;
}
return candidate;
}
};
解释:
这个解法使用的是摩尔投票法(Boyer-Moore Voting Algorithm),它是一种在时间复杂度为O(n)且空间复杂度为O(1)的情况下找出数组中多数元素的有效算法。基本思想是,多数元素的个数比其他所有元素的个数加起来还要多,所以可以通过计数的方法来找到它。
算法步骤如下:
- 维护一个候选元素
candidate和一个计数器count。初始时,任选数组中的一个元素作为候选元素,计数器为1。 - 遍历数组中每个元素,对于当前元素
num:- 如果计数器为0,我们假设当前元素是多数元素,因此将
candidate设置为num,并将count设为1。 - 如果计数器不为0,我们将当前元素
num与candidate比较:- 如果它们相等,则增加计数器。
- 如果它们不等,则减少计数器。
- 如果计数器为0,我们假设当前元素是多数元素,因此将
- 在数组遍历完成后,
candidate即为多数元素。
由于题目已经假设一定存在一个多数元素,因此上述算法可以直接返回最后的candidate作为答案。如果没有这个假设,我们还需要遍历数组来验证candidate是否真的是多数元素。