169. Majority Element
题目大意
Given an array nums
of size n
, return the majority element.
The majority element is the element that appears more than ⌊n / 2
⌋ times. You may assume that the majority element always exists in the array.
中文释义
给定一个大小为 n
的数组 nums
,返回多数元素。
多数元素是指在数组中出现次数超过 ⌊n / 2
⌋ 的元素。你可以假设数组中总是存在多数元素。
示例
Example 1:
- Input:
nums = [3,2,3]
- Output:
3
Example 2:
- Input:
nums = [2,2,1,1,1,2,2]
- Output:
2
Constraints:
n == nums.length
1 <= n <= 5 * 10^4
-10^9 <= nums[i] <= 10^9
解题思路
算法描述 - 摩尔投票法
使用了摩尔投票法来找到数组中的多数元素。多数元素定义为在数组中出现次数超过数组长度一半的元素。
-
初始化变量:
candidate
: 作为多数元素的候选,初始设为数组的第一个元素。cnt
: 记录候选元素的"积分",初始设为1,代表候选元素的初始积分。
-
遍历数组 - 应用摩尔投票法:
- 从数组的第二个元素开始遍历。
- 摩尔投票法的核心在于配对不同的元素并消除它们。具体实现为:
- 如果
cnt
为0,说明之前的候选元素和其他元素已经完全抵消,因此需要选取当前元素作为新的候选元素,并重置cnt
为1。 - 在遍历过程中,如果当前元素与候选元素相同,
cnt
加1(增加积分);如果不同,则cnt
减1(减少积分)。
- 如果
-
返回结果:
- 遍历完成后,由于多数元素的数量超过数组长度的一半,所以最终剩下的
candidate
即为所求的多数元素。
- 遍历完成后,由于多数元素的数量超过数组长度的一半,所以最终剩下的
cpp
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = nums[0], cnt = 1;
for (int i = 1; i < nums.size(); i++) {
if (cnt == 0) {
candidate = nums[i];
cnt = 1;
} else {
cnt = candidate == nums[i] ? cnt + 1 : cnt - 1;
}
}
return candidate;
}
};