方法一:摩尔投票法
对于有
n
n
个元素的数组,求其中的某元素,该元素个数大于 ,可以使用摩尔投票法,但是要求该元素必存在。该方法的时间复杂度为 O(logn)
,因为遍历一遍元素。
class Solution {
public:
int majorityElement(vector<int>& nums) {
int count = 0, elem = 0;
for(int num : nums){
if(count == 0){
elem = num;
count++;
}else{
if(elem == num) count++;
else count--;
}
}
return elem;
}
};
方法二:分治法
分治法解决这个问题的一个主要的思想是,将长度为
n
n
<script type="math/tex" id="MathJax-Element-127">n</script> 的数组划分成小的部分,每一个部分求出当前部分中出现次数最多的元素。该算法的时间复杂度是 O(nlogn)
class Solution {
public:
int majorityElement(vector<int>& nums) {
return majorityElementDivide(nums,0,nums.size()-1);
}
private:
int countNum(vector<int>& nums, int start, int end, int num){
int count = 0;
for (int i = start; i <= end; ++i) {
if(nums[i]==num) count++;
}
return count;
}
int majorityElementDivide(vector<int>& nums, int start, int end){
if(start==end) return nums[start];
int mid = (start + end)/2;
int left = majorityElementDivide(nums, start, mid);
int right = majorityElementDivide(nums, mid + 1, end);
if(left==right) return left;
int leftNum = countNum(nums, start, mid, left);
int rightNum = countNum(nums, mid+1, end, right);
return leftNum > rightNum ? left : right;
}
};