題目:求眾數
給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。
你可以假設陣列是非空的,並且給定的陣列總是存在眾數。
複製程式碼
示例:
輸入: [3,2,3]
輸出: 3
輸入: [2,2,1,1,1,2,2]
輸出: 2
複製程式碼
思考:
這道題可以通過摩爾投票演算法來解決。
通俗的講就是:
先假設陣列第0個就是所要求眾數result,用一個變數times記下其出現次數為1次,然後向後遍歷陣列元素分別與這個數對比,如果相等則times+1,這很好理解。
如果不等就說明有另一個數出現了1次,這個數的出現“抵消”了原來result出現的1次,將times-1。
當times等於0時,說明原來認為的眾數result出現次數,被“抵消”完了。則將下一個數認為是新的所求眾數。
注:因為陣列非空且給定的陣列是一定存在這個眾數。所以假如陣列長度為偶數2n,則不會有一個數出現n次其他數也出現n次的情況。
所以按照演算法思路最終會剩下一個數就是所要求的眾數。
複製程式碼
實現:
class Solution {
public int majorityElement(int[] nums) {
int result = nums[0];
int times = 1;
for (int i = 1; i < nums.length; i++) {
if (result == nums[i]) {
times++;
} else {
times--;
if (times == 0) {
result = nums[++i];
times++;
}
}
}
return result;
}
}複製程式碼