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; } }
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]; } };
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; } } } };
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; } }
6.分治
处理这种问题都可以尝试下分治方法,这道题也可以不过感觉太麻烦,就不写了。