題目描述
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。
思路詳解
思路1---尋找中位數(會改變原數組的順序)
1. 先整體排序,找到中位數
(1)先對數組進行排序,如果某個數字m的出現次數超過數組長度的一半,那麼排序之後的數組的中間元素一定是該數字m
(2)獲得排序之後的數組的中間元素value = numbers[size/2]
(3)統計該數字出現的次數是否大於數組長度的一半
爲了減少遍歷次數,可以從中間向兩邊遍歷,計數value出現的次數
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int s = numbers.size();
if(s == 0)
return 0;
sort(numbers.begin(), numbers.end());
int value = numbers[s / 2];
int cnt = 0;
int i = 0;
for(i = 0; i < s; i++)
{
if(numbers[i] == value)
break;
}
while(i < s)
{
if(numbers[i] != value)
break;
cnt++;
i++;
}
if(cnt > (s/2))
return value;
else
return 0;
}
};
2. 利用快速排序思想找到中位數
(會改變原數組的順序)
---尋找數組的中位數
出現次數超過數組長度的一半的數字一定是數組的中位數,利用快速排序的思想:
(1)在數組中隨機找一個數,將小於它的數放在他的左邊,大於它的數放在他的右邊
(2)如果這個數的下標剛好是size/2,那麼他就是數組的中位數
(3)否則,如果他的下標<size/2,中位數在它的右邊,>size/2中位數在它的左邊
(4)遞歸在它的左邊或右邊部分進行查找
---判斷中位數的出現次數是否大於數組長度的一半
遍歷一遍數組,統計中位數的出現次數,判斷是否超過長度的一半
思路2--- 數組的特點之次數和
(不改變原數組的順序)
出現次數超過數組長度的一半,說明它出現的次數比數組中所有元素出現的次數和還要多
因此可以在遍歷的時候保存兩個值,一個是數組中的數字value,一個是次數
(1)與前一個數字相同時,times++
(2)與前一個數字不同時,times--
(3)當times爲0時,value重新賦值爲當前的元素,並將times設置爲1