第一种方法非常简洁,虽然时间复杂度并不是最小的,为O(nlogn),直接对数组进行排序,然后返回nums[n / 2]即可,代码如下:
public class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length / 2];
}
}
第二种方法为Moore Voting Algorithm,在算法执行过程中,我们使用常量空间实时记录一个候选元素candidate以及其出现次数count,在开始的时候,candidate设置为数组中的第一个元素,count设置为1,在继续迭代数组的过程中,每找到两个不同的元素,就成对删除,即count--。Moore Voting Algorithm是一个用来寻找majority element的算法,演示在此:http://www.cs.utexas.edu/~moore/best-ideas/mjrty/example.html,时间复杂度为O(n),代码如下:
public class Solution{
public int majorityElement(int[] nums){
int candidate = 0;
int count = 0
for(int i = 0; i < nums.length; i++){
if(count == 0){
candidate = nums[i];
count = 1;
}else{
if(nums[i] == candidate){
count++
}else{
count--;
}
}
}
return candidate;
}
}
知识点:
1. Moore Voting Algorithm可以记一下