題目描述
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。
劍指offert書中給出答案比較簡單,根據數組的特徵來統計
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
//判斷是否爲空
int n = numbers.size();
if (n == 0) return 0;
//由於數字出現超過一半,故從第一個數字開始計數,若下一個數字等於當前數字,則計數加一,否則,減一。若爲零,則從當前數字開始計數,將數字替換成當前數字,且設計數爲1.
int num = numbers[0], count = 1;
for (int i = 1; i < n; i++) {
if (numbers[i] == num) count++;
else count--;
if (count == 0) {
num = numbers[i];
count = 1;
}
}
// 找到大於一半的數字後,開始計數
count = 0;
for (int i = 0; i < n; i++) {
if (numbers[i] == num) count++;
}
//保證計數大於一半
if (count * 2 > n) return num;
return 0;
}
};