題目描述
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由于數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。
思路
如果有符合條件的數字,則它出現的次數比其他所有數字出現的次數和還要多。
在遍歷數組時保存兩個值:一是數組中一個數字,一是次數。遍歷下一個數字時,若它與之前保存的數字相同,則次數加1,否則次數減1;若次數為0,則保存下一個數字,并將次數置為1。遍歷結束后,所保存的數字即為所求。然后再判斷它是否符合條件即可。
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.empty())
return 0;
// 遍歷每個元素,并記錄次數;若與前一個元素相同,則次數加1,否則次數減1
int result=numbers[0];
int times=1;
for(int i=1;i<numbers.size();i++){
if(times==0){
// 更新result的值為當前元素,并置次數為1
result=numbers[i];
times=1;
}
else if(numbers[i]==result)
++times;
else
--times;
}
// 判斷result是否符合條件,即出現次數大于數組長度的一半
times=0;
for(int i=0;i<numbers.size();i++){
if(numbers[i]==result)
++times;
}
return (times>numbers.size()/2)?result:0;
}
};