多数元素

时间:2019-11-27
本文章向大家介绍多数元素,主要包括多数元素使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [3,2,3]
输出: 3
示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2

code1:分治,首先把数组划分为长度为1的子区间,长度为1时,每个元素就是本身子数组中的众数,然后两两合并子数组,如果左右数组的返回值相同,则这个值就是合并后的两数组的的众数,否则在合并后的区间内统计左右子区间的返回值,出现次数多的为众数。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        if(nums.empty())
            return 0;
        
        return majorityElementCore(nums,0,nums.size()-1);
    }
private:
    int majorityElementCore(vector<int>& nums,int start,int end)
    {
        if(start==end)
            return nums[start];
        
        int mid=start+(end-start)/2;
        int left=majorityElementCore(nums,start,mid);
        int right=majorityElementCore(nums,mid+1,end);

        if(left==right)
            return left;

        int leftCount=countNum(nums,left,start,end);
        int rightCount=countNum(nums,right,start,end);
        return leftCount>=rightCount?left:right;
    }
    int countNum(vector<int>& nums,int num,int left,int right)
    {
        int count=0;
        for(int i=left;i<=right;++i)
        {
            if(nums[i]==num)
                ++count;
        }
        return count;
    }
};

code2:按照计数的方法来解题,先选一个候选数字(比如第一个作为众数),然后依次遍历数组中的每个元素,如果当前元素和候选数字相同,则计数结果+1,否则-1,当计数结果为0时,更新当前数字为候选众数

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        if(nums.empty())
            return 0;
        
        int sum=1,resNum=nums[0];
        for(int i=1;i<nums.size();++i)
        {
            if(sum==0)
                resNum=nums[i];
            sum+=resNum==nums[i]?1:-1;
        }
        return sum>=0?resNum:0;
    }
};

原文地址:https://www.cnblogs.com/tianzeng/p/11940401.html