【LeetCode】 Majority Element 系列

来源:互联网 发布:朗读软件手机版 编辑:程序博客网 时间:2024/06/05 19:43

Majority Element 系列

169. Majority Element

介绍

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.

解答

摩尔投票算法

class Solution {public:    //摩尔投票算法    int majorityElement(vector<int> & nums)    {        int count = 1, major = nums[0], n = nums.size();        for(int i = 1; i < n; ++i)        {            if(!count)  major = nums[i],count = 1;            else if(nums[i] == major)    ++count;            else --count;        }        return major;    }};

位操作

class Solution {public:    //Bit Manipulation    int majorityElement(vector<int> & nums)    {        int bitCount = 0,majority = 0, n = nums.size();        int mask = 1;        while(mask)        {            int bitCount = 0;            for(int j = 0; j < n; ++j)            {                if(nums[j] & mask)  ++bitCount;                if(bitCount > n/2)                  {                    majority |= mask;                    break;                }            }            cout << mask << endl;            mask <<= 1;        }        return majority;    }  };

哈希表

class Solution {public:   //哈希表    int majorityElement(vector<int>& nums) {        unordered_map<int,int> help;        for(auto val : nums)            ++help[val];        for(auto val: help)            if(val.second > nums.size()/2)                return val.first;    }};#### 分治法```cppclass Solution {public:    //Divide and Conquer 分治法    int majorityElement(vector<int>& nums)    {        return getMajorityElement(nums,0,nums.size()-1);    }private:    int getMajorityElement(const vector<int>& nums,int left,int right)    {        if(left == right)   return nums[left];        int mid = (left+right)/2;        int leftMajority = getMajorityElement(nums,left,mid);        int rightMajority = getMajorityElement(nums,mid+1,right);        if(leftMajority == rightMajority)   return leftMajority;        return count(nums.begin()+left,nums.begin()+mid+1,leftMajority) > count(nums.begin()+mid+1,nums.begin()+right+1,rightMajority) ? leftMajority : rightMajority;    }};<div class="se-preview-section-delimiter"></div>

229. Majority Element II

介绍

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

解答

摩尔投票算法

class Solution {public:    // Boyer-Moore Majority Vote algorithm 摩尔投票算法    vector<int> majorityElement(vector<int>& nums) {        int count1 = 0,count2 = 0;        int majority1 = 0, majority2 = 0,n =  nums.size();        if(n == 0)  return vector<int>();        for(int i = 0; i < n; ++i)        {            if(nums[i] == majority1)                ++count1;            else if (nums[i] == majority2)                ++count2;            else if(count1 == 0)            {                majority1 = nums[i];                count1 = 1;            }else if(count2 == 0)            {                majority2 = nums[i];                count2 = 1;            }            else                 --count1,--count2;        }        vector<int>  res;        count1 = count2 = 0;        for(auto val : nums)        {            if(val == majority1)    ++count1;            if(val == majority2)    ++count2;        }        if(count1 > n/3)    res.push_back(majority1);        if(majority1 != majority2)        {            if(count2 > n/3)    res.push_back(majority2);        }        return res;       }};
原创粉丝点击