这道题的目的是找到数组中出现次数大于一半的数字,一开始的想法是使用一个HashMap记录各个数字出现的次数,然后从中找到出现次数大于nums.length / 2的数字,这种方法比较直接,但是使用了O(n)的额外空间,算不上是最好的方法。
LeetCode的discuss版里有人提出了一个更好的解法,我们首先把majority element设置为数组的第一个数字,并且把数字出现的次数设置为count = 1,然后从第二个数字开始向后扫描,如果遇到的数字与majority element相等,那么count++,否则count--,如果count == 0,那么把majority element设置为当前的元素并且把count设置为1。这个算法的总体思想就是使用出现次数大于nums.length / 2的元素去抵消其他的元素,那么最后留下的一定是出现次数大于nums.length / 2的元素。代码如下:
public class Solution {
public int majorityElement(int[] nums) {
if(nums == null || nums.length == 0) return 0;
int majorElem = nums[0];
int count = 1;
for(int i = 1; i < nums.length; i++){
if(nums[i] == majorElem) count++;
else if(nums[i] != majorElem) count--;
if(count == 0){
majorElem = nums[i];
count++;
}
}
return majorElem;
}
}