这段代码是一个 C++ 的解决方案,用于查找数组中出现次数超过一半的元素(众数)。其实现步骤如下:
- 排序:首先对输入的数组
nums
进行排序。 - 计数:通过遍历已排序的数组,统计每个元素出现的次数,并记录最大出现次数的元素。
- 返回结果:最后返回出现次数最多的元素。
不过,这个实现的方法在时间复杂度上并不是最优。下面我提供一种更高效的方法,即使用 Boyer-Moore 投票算法,其时间复杂度为 O(n),空间复杂度为 O(1)。
Boyer-Moore 投票算法实现
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = nums[0];
int count = 1;
for (int i = 1; i < nums.size(); ++i) {
if (nums[i] == candidate) {
count++;
} else {
count--;
if (count == 0) {
candidate = nums[i];
count = 1;
}
}
}
return candidate;
}
};
解释:
- 候选者和计数器:初始化一个候选者(
candidate
)和一个计数器(count
)。 - 遍历数组:
- 如果当前元素与候选者相同,计数器加一。
- 如果不同,计数器减一。如果计数器归零,就将当前元素设为新的候选者,并重置计数器为一。
- 最终结果:由于题目保证了存在众数,最后返回的
candidate
就是答案。
这种方法效率更高且不需要额外空间来存储频率,因此推荐使用。
内容由零声教学AI助手提供,问题来源于学员提问