• leetcode169——Majority Element (C++)


    Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

    You may assume that the array is non-empty and the majority element always exist in the array.

    个人博客:http://www.cnblogs.com/wdfwolf3/

    题目比较好理解,在含有n个元素的数组中找出出现次数超过⌊n/2⌋的元素,假设数组不为空而且这个数是一定存在的。

    1.moore-voting算法

    这个算法就是为解决这个问题诞生的,主要思想就是找出一对不同的元素就去掉它们,最后剩下的一定是所找的元素。

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            int result=nums[0],count,i;
            for(i=1,count=1;i<nums.size();i++)
            {
                count+=nums[i]==result?1:-1;
                if(count>nums.size()/2)
                    break;
                if(count==0)
                {
                    count=1;
                    result=nums[i+1];
                    i++;
                }
            }
            return result;
        }
    }
    View Code(16ms)

    2.hash

    遍历数组,利用hash方式记录元素出现的次数,当某个元素次数超过⌊n/2⌋时,即为我们要找的。

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            unordered_map<int,int> m;
            int i;
            for(i=0;i<nums.size();i++)
            {
                if(++m[nums[i]]>(nums.size()/2))
                    return nums[i];
            }
            return nums[0];
        }
    };
    View Code(28ms)

    3.sorting

    对数组进行排序,由于要找的元素超过半数,所以下标n/2的元素一定是它,这里总数奇偶不影响,可以自己举例验证一下。

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {      //40ms
            sort(nums.begin(),nums.end());
            return nums[nums.size()/2];
        }
    };

    4.randomization

    随机选取数组中的一个数,验证它是不是超过半数的数字。时间最快,有一半几率选中,当然最坏的情况比较糟糕,但这不重要,就像快速排序时间复杂度一样。

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            srand(unsigned(time(NULL)));
            int tmp,i,count;
            while(true)
            {
                tmp=nums[rand()%nums.size()];
                for(i=0,count=0;i<nums.size();i++)
                {
                    if(tmp==nums[i])
                        count++;
                    if(count>nums.size()/2)
                        return tmp;
                }
            }
        }
    };
    View Code(16ms)

    5.bit manipulation

    就是把数字都作为二进制处理,每个二进制位上的n个bit相加看是否大于n/2,大于的话这一位上是1,小于的话就是0,把32位都这么处理完就知道结果是多少了。

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            int i,j,count,major=0;
            for(i=0;i<32;i++)
            {
                for(j=0,count=0;j<nums.size();j++)
                {
                    if((nums[j]>>i&1)==1)
                        count++;
                }
                if(count>nums.size()/2)
                    major+=(1<<i);
            }
            return major;
        }
    }
    View Code(40ms)

    6.分治

    处理这种问题都可以尝试下分治方法,这道题也可以不过感觉太麻烦,就不写了。

  • 相关阅读:
    基础编程练习题第一波
    TYVJ 1541 八数码
    NOIP 2014 寻找道路
    NOIP2014 解方程
    POJ 3213 矩阵乘法(优化)
    POJ 1523 Tarjan求割点
    POJ 3237 树链剖分+线段树
    SPOJ 375 树链剖分
    NOIP 2012 T2 国王游戏 (贪心+高精)
    POJ 1364 差分约束
  • 原文地址:https://www.cnblogs.com/wdfwolf3/p/5490887.html
Copyright © 2020-2023  润新知