文章目录
看这篇总结:【算法】摩尔投票法 找 多数元素_小威W的博客-优快云博客
169.多数元素(找频率>n/2,且多数元素一定存在)
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3]
输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
提示:
- n ==
nums.length
- 1 <= n <= 5 * 104
- -10^9 <=
nums[i]
<= 10^9
思路
这道题目是找出现频率高于n/2的元素,是投票法。
投票法(Boyer-Moore Voting Algorithm)是一种用于在数组中查找主要元素的算法,主要元素定义为一个元素出现次数超过数组长度的一半。它并不一定能找到频率最高的元素,例如在数组 [1, 2, 2, 3, 3, 3]
中,频率最高的元素是 3
,但没有元素出现次数超过数组长度的一半,因此投票法不会返回任何元素。如果数组 [1, 1, 2, 2, 3, 3, 3, 3]
中,频率最高的元素也是主要元素,这时投票法会返回元素 3
。
如果一个元素是数组的多数元素(出现次数超过数组长度的一半),那么即使我们把它和其他每个不同的元素一一抵消(每次都从数组中删除两个不同的元素),最后剩下的一定是这个多数元素。
- 基本的投票法是找**数组中出现频率超过半数(必须是超过不能是等于)**的元素。
- 数组中出现频率超过半数的元素,一定只有一个!
完整版
class Solution {
public:
int majorityElement(vector<int>& nums) {
int ans=-1,count=0;
for(int num:nums){
if(count==0) ans = num;
//这样写的话,else会和直接相邻的上一个if组成if-else
if(num==ans) count++;
else count--;
}
return ans;//注意ans就是多数元素!
}
};
补充:
在C++中,else
语句总是与最近的一个未配对的if
语句进行配对。因此,上面写法中,else
语句是与第二个if
语句配对的,形成了一个if-else
结构。
上面是比较直观的写法,也可以换成另一种逻辑更清晰的:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int ans=-1,count=0;
for(int num:nums){
if(count==0) ans = num;
count += (num==ans)?1:-1;
}
return ans;//注意ans就是多数元素!
}
};