leetcode 剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制:
1 <= 数组长度 <= 50000
解法一(摩尔投票法)
int majorityElement(vector<int>& nums) { if(CheckInvalidArray(nums)) return -1; int result = nums[0]; int times = 0; for(int i=0; i<nums.size(); i++){ if(nums[i]==result){ times++; } else{ times--; if(times==0){ result = nums[i]; times = 1; } } } return result; } bool CheckInvalidArray(vector<int>&numbers){ if(numbers.empty() && numbers.size()<=0){ return true; } else return false; }
解法二(排序)
class Solution { public: int majorityElement(vector<int>& nums) { if(CheckInvalidArray(nums)) return -1; sort(nums.begin(), nums.end()); return nums[nums.size()/2]; } bool CheckInvalidArray(vector<int>&numbers){ if(numbers.empty() && numbers.size()<=0){ return true; } else return false; } };
解法三(哈希)
class Solution { public: int majorityElement(vector<int>& nums) { unordered_map <int, int> mp; for(int n:nums) if(++ mp[n] > nums.size()/2) return n; return -1; } bool CheckInvalidArray(vector<int>&numbers){ if(numbers.empty() && numbers.size()<=0){ return true; } else return false; } };
解法四(位运算)
class Solution { public: int majorityElement(vector<int>& nums) { int ans = 0; for(int i=0; i<32; i++){ int one_num = 0; for(int n:nums){ one_num += ((n>>i)&1); } if(one_num > nums.size() / 2){ ans ^= (1<<i); } } return ans; } bool CheckInvalidArray(vector<int>&numbers){ if(numbers.empty() && numbers.size()<=0){ return true; } else return false; } };
下一篇:
C语言简单实现折半查找法