[牛課習題]數組中出現次數超過一半的數字

題目描述

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

示例

輸入

[1,2,3,2,2,2,5,4,2]

返回值

2

題目分析:

  • 首先可以採用暴力破解法,出現次數多的元素在排序後肯定會在數組的中間位置,只需找出這個元素再去統計它出現的次數,判斷其是否超過數組長度的一半即可。
  • 其次,我們可以使用STL當中的unordered_map容器,map中存入的是key-value鍵值對,我們把數組中的元素值作爲value,出現的次數作爲key值,遍歷整個數組更新map;最後在根據數組中元素出現的次數進行判斷,從而得到所需結果。

參考代碼:

解法一

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.empty())
            return 0;

        sort(numbers.begin(), numbers.end());

        int size = numbers.size();
        int res = numbers[size/2];
        int count = 0;

        for(int i = 0; i < size; ++i)
        {
            if(numbers[i] == res)
                count++;
        }

        return (count > size/2) ? res : 0;
    }
};

解法二

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        std::unordered_map<int,int> match;
        for(const int val : numbers)
            ++match[val];

        for(const int val : numbers)
        {
            if(match[val] > numbers.size()/2)
                return val;
        }
        return 0;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章