1. 程式人生 > >統計陣列中出現次數超過一半的數字

統計陣列中出現次數超過一半的數字

題目描述

陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

解題思路

暴力法的時間複雜度時O(N2)O(N^2),肯定不行。正確的思路是,對陣列進行從小到大排序,然後線性查詢即可。這樣的時間複雜度時O(logN)O(\log N)

AC程式碼

class Solution {
  public:
    int MoreThanHalfNum_Solution(vector<int> numbers)
{ if(numbers.empty()) { return 0; } sort(numbers.begin(), numbers.end()); auto len = numbers.size(); int curMax = numbers[0], curN = 1; // 當前最大值時1 int Max = numbers[0], N = 0; // 當前的資料和個數 for(int i = 1; i < len; ++i) { if
(curMax == numbers[i]) { // 當前最大值+1 ++curN; } else { // 現在不是最大值的範圍了 if(Max == numbers[i]) { // 如果當前Max連續的話 ++N; if(N >= curN) { // 最大值發生更替 curN = N; curMax = Max; }
} else { Max = numbers[i]; // 越過Max的範圍了,重新計數 N = 1; } } } if(curN > len / 2) { return curMax; } else { return 0; } } };