題目:數組中出現次數超過一半的數字。
思路:
通常做法是先對數組排序,然後再遍歷一遍數組即可找到。但是這樣做時間複雜度爲O(n*logn).在面試中,這樣做肯定不行。
我們不妨換一種思路,如果某個數字在數組中出現次數超過數組長度一半,則其餘數字出現之和一定小於數組長度一半。
因此我們可以考慮在遍歷數組的時候保存兩個值:一個是數組中的一個數字,一個是次數。當我們遍歷到下一個數字的時候,如果下一個數字和我們之前保存的數字相同,則次數加1;如果下一個數字和我們之前保存的數字不同,則次數減1;如果次數爲零,則保存下一個數字,並把次數設爲1。
由於我們要找的數字出現的次數比其他所有數字出現的次數之和還要多,那麼要找的數字肯定是最後一次把次數設爲1時對應的數字。
bool flag = true;//標誌,判斷輸入是否有效
int findMoreThanHalfNumber(int A[],int n){
if(n == 0){
flag = false;
return 0;
}
flag = true;
int target = A[0];
int count = 1;
for(int i = 0;i < n;i++){
if(count == 0){
target = A[i];
count = 1;
}
else if(target == A[i])
count++;
else
count--;
}
count = 0;
for(int i = 0;i < n;i++){
if(A[i] == target)
count++;
}
if(count*2 <= n){
flag = false;
target = 0;
}
return target;
}