這道題的目的是找到數組中出現次數大於一半的數字,一開始的想法是使用一個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;
}
}