題目描述:
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。
你可以假設數組是非空的,並且給定的數組總是存在多數元素。
示例 1:
輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
輸出: 2
限制:
1 <= 數組長度 <= 50000
題解
摩爾投票法:
- 票數和: 由於衆數出現的次數超過數組長度的一半;若記 衆數 的票數爲 +1,非衆數 的票數爲 -1 ,則一定有所有數字的 票數和 > 0 。
- 票數正負抵消: 設數組 nums 中的衆數爲 x ,數組長度爲 n 。若 nums 的前 a 個數字的 票數和 = 0 ,則 數組後 (n-a)個數字的 票數和一定仍 >0 (即後 (n-a) 個數字的 衆數仍爲 x )。
class Solution {
public int majorityElement(int[] nums) {
//摩爾投票法
int res=0;
//票數
int votes=0;
for(int num :nums){
//vote爲0的話,說明在此之前都互相抵消了。創建新的res
if(votes==0){
res=num;
}
//當前數字等於目前的衆數嗎?
//等於則票數+1,否則-1
votes+= num==res?1:-1;
}
return res;
}
}