LeetCode: Majority Element

来源:互联网 发布:缺血半暗带的算法 编辑:程序博客网 时间:2024/06/09 00:40

题目:
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.

解法一:
最直观的解法是检查每个元素是否为majority element, 两轮循环,算法复杂度为O(n^2)。如果用STL里map里的find函数来查找,时间复杂度可以优化为o(nlogn)。或者将数组排序后在找,时间复杂度也为O(nlogn)。此处不再赘述。

解法二:
分治法:将原数组分为两部分,分别查找两个子数组的majority element,得到A和B两个元素,若A == B则说明该元素就是Majority Element,否则对A和B分别进行判断是否为Majority Element。时间复杂度为O(nlogn)。Accepted的代码:

class Solution {public:    int devide(int x,int y,vector<int>& nums)    {        if(x==y) return nums[x];        int mid=(x+y)/2;        int left=devide(x,mid,nums);        int right=devide(mid+1,y,nums);        if(left==right) return left;        else        {            int countleft=0;            int countright=0;            for(int i=x;i<=y;i++)            {                if(nums[i]==left) countleft++;                if(nums[i]==right) countright++;            }            return countleft>countright? left:right;        }    }    int majorityElement(vector<int>& nums) {        return devide(0,nums.size()-1,nums);    }};

解法三:
在网上看到一种线性复杂度(O(n))的算法, Moore’s Voting Algorithm,是Robert S.Boyer 和J Strother Moore于1980年发明的。算法思想:将不同的单词成对删除,最后留下的单词即是majority element。Accepted的代码:

class Solution {public:    int majorityElement(vector<int>& nums) {        int temp=nums[0];        int count=1;        for(int i=1;i<nums.size();i++)        {            if(count==0)            {                temp=nums[i];                count++;            }            else            {                if(nums[i]==temp) count++;                else count--;            }        }        return temp;    }};
0 0
原创粉丝点击