题意:数组长度为N,找出数组中元素出现个数大于N/2 的众数
法一:先排序,再来一次遍历硬数一下
class Solution { public: int majorityElement(vector<int>& nums) { if (nums.size() == 1) return nums[0]; int ret = 1,val,tmp=1; sort(nums.begin(),nums.end()); for (int i=1; i<nums.size(); i++) { if (nums[i] == nums[i-1]) { tmp++; if (tmp > ret) { ret = tmp; val = nums[i]; } } else { tmp = 1; } } return val; } };
法二:Moore Voting Algorithm算法,动画在这里:http://www.cs.utexas.edu/~moore/best-ideas/mjrty/example.html#step12 看了动画就能理解了
class Solution { public: int majorityElement(vector<int>& nums) { int elem = nums[0],ct = 1; for (int i=1; i<nums.size(); i++) { if (ct == 0) { elem = nums[i]; ct = 1; } else if (nums[i] == elem) { ct++; } else if (nums[i] != elem) { ct--; } } return elem; } };
法三:随机数,
class Solution { public: int majorityElement(vector<int>& nums) { if (nums.size() == 1)return nums[0]; while (1) { int pos = rand()%(nums.size() -1); int ct = 0; for (int i=0; i<nums.size(); i++) { if (nums[i] == nums[pos])ct++; } if (ct > nums.size()/2 ) return nums[pos]; } } };