題目描述
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲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;
}
};