剑指offer(39)
剑指offer(39)
剑指 Offer 39. 数组中出现次数超过一半的数字
难度简单279
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
限制:
1 <= 数组长度 <= 50000
1.排序后取中值
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n=nums.size();
return nums[n/2];
}
};
2.摩尔投票
原理就是把众数全记为+1,其余记为-1,他们的和必定大于0;因此遍历数组,先假设第1个数是众数,如果和小于0,那么就更换众数
class Solution {
public:
int majorityElement(vector<int>& nums) {
int majority=-1;
int cnt=0;
for(int i=0;i<nums.size();i++){
if(nums[i]==majority){
cnt++;
}else{
cnt--;
}
if(cnt<0){
majority=nums[i];
cnt=1;
}
}
return majority;
}
};
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16217655.html