剑指 Offer 39. 数组中出现次数超过一半的数字
作者:互联网
思路1 排序
由于最多的数字 出现的次数超过了数组长度的一半,因此排序之后正中间的数字就是这个众数
一定要记住快排模板。
很遗憾,当数字很长的时候,超过时间限制了 = =
class Solution {
public:
// 排序
int majorityElement(vector<int>& nums) {
quickSort(nums,0,nums.size()-1);
return nums[nums.size()/2];
}
void quickSort(vector<int>& nums, int left, int right){
int i = left, j = right;
if(i>=j) return; // i==j 只有一个数了,就没有排序的必要了
while(i<j){
while(i<j && nums[j]>=nums[left]) j--; // 后面不要忘了等于号!!!!
while(i<j && nums[i]<=nums[left]) i++;
swap(nums[i],nums[j]);
}
swap(nums[i],nums[left]); // 枢纽移到“中间”
// 此时 i == j;
quickSort(nums, left, i-1);
quickSort(nums, i+1, right);
}
};
思路2–摩尔投票
关于摩尔投票,可以看看这些文章
动画展示摩尔投票
代码描述摩尔投票 我代码就是照着他写的
class Solution {
public:
int majorityElement(vector<int>& nums) {
int cand; // 候选人
int vote=0; // 当前候选人的选票
// 第一阶段,成对抵消
for(int num:nums){
if(vote==0) {
// 只有选票为零,才可能更换候选人
// 选票为零,可能是第一个数,也有可能是前面全部抵消了,所以确定新的候选人
cand = num;
vote = 1;
}else{
// 选票不为零,判断当前num是否是候选人,如果是票数加1,否则当前候选人票数减1
if(num == cand) vote++;
else vote--;
}
}
// 第二阶段:统计票数(选出候选人)
for(int num:nums){
if(num==cand)
return num;
}
return 0;
}
};
标签:39,return,nums,int,Offer,num,数组,vote,候选人 来源: https://blog.csdn.net/qq_42133142/article/details/120637787