- 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
- 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
class Solution {
public:
int majorityElement(vector<int>& nums) {
// 先排序
int ans;
int len = nums.size();
sort(nums.begin(), nums.end());
ans = nums[len / 2];
return ans;
}
};
class Solution {
public:
int majorityElement(vector<int>& nums) {
int count = 1;
int maj = nums[0];
for(int i = 1; i < nums.size(); ++i){
if(maj == nums[i]){
count++;
}
else{
count--;
if(count == 0){
maj = nums[i + 1];
}
}
}
return maj;
}
};
这段代码是一个 C++ 类 Solution
的定义,其中包含了一个名为 majorityElement
的成员函数,用于找出输入数组 nums
中的主要元素。
主要元素是指在数组中出现次数超过数组长度一半的元素。这段代码使用了一种称为摩尔投票算法(Moore’s Voting Algorithm)的方法来实现在线性时间复杂度 O(N) 和常量空间复杂度下找出主要元素。
以下是对这段代码的解释:
- 首先,定义了一个变量
count
并初始化为 1,用于记录当前候选主要元素的出现次数。 - 定义了一个变量
maj
并初始化为数组nums
的第一个元素,作为候选主要元素。 - 遍历数组
nums
,从第二个元素开始,通过for
循环。 - 在循环中,判断当前元素
nums[i]
是否与候选主要元素maj
相等。- 若相等,将
count
自增 1,表示当前元素的出现次数增加了。 - 若不相等,将
count
自减 1,表示当前元素的出现次数减少了。
- 若相等,将
- 接着判断
count
是否等于 0,若等于 0,则说明候选主要元素maj
的出现次数已经被抵消掉,需要重新选择候选主要元素。 - 将
maj
更新为下一个元素nums[i + 1]
,作为新的候选主要元素。 - 最后,遍历完成后,
maj
就是找到的主要元素,直接返回即可。
需要注意的是,这段代码假定输入数组 nums
中一定存在主要元素,并且不会出现多个主要元素的情况。如果输入数组不满足这些条件,代码可能会返回错误的结果。在实际使用时,需要根据具体情况进行验证和处理。
在这段代码中,maj
在更新时使用了 nums[i + 1]
而不是 nums[i]
,是因为在更新 maj
时,需要保证新的候选主要元素 maj
在当前位置 i
之后的元素中出现的次数比在当前位置 i
之前的元素中出现的次数多。
这是因为在这段代码中,使用了 count
变量来记录当前候选主要元素的出现次数,而每次遇到不相等的元素时,会将 count
自减 1。如果在更新 maj
时选择了 nums[i]
,则当前位置 i
之后的元素与当前位置 i
之前的元素的出现次数是相等的,因为 count
被减为 0 时才会更新 maj
。
而选择 nums[i + 1]
作为新的候选主要元素,可以确保新的候选主要元素在当前位置 i
之后的元素中出现的次数至少比在当前位置 i
之前的元素中出现的次数多 1。这样,在后续的遍历中,即使 count
在之后的元素中被减为 0,也能保证新的候选主要元素仍然有出现次数超过一半的机会。
这种更新策略保证了摩尔投票算法的正确性,能够正确找出输入数组中的主要元素。