剑指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;
    }
};

posted @ 2022-05-03 08:57  BailanZ  阅读(21)  评论(0编辑  收藏  举报