劍指offer題解(陣列中出現次數超過一半的數字)
題目描述
陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。
解題思路
先找到出現次數最多的一個數字(一個數組去掉兩個大小不同的數字,出現次數最多的數字依然還是出現次數最多的數字,所以用兩個指標i,j分別從從陣列的兩端向中間收縮,如果兩個元素不相等,移動兩個指標,否則移動一個指標,最後的那個元素就是出現次數最多的元素)。然後遍歷整個陣列看這個數字出現次數有沒有超過陣列元素個數的一半,如果有就返回這個數字,否則返回0。
程式碼
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int len=numbers.size();
int i=0,j=len-1;
while(i<j)
{
if(numbers[i]!=numbers[j])
{
i++;
j--;
}
else
i++;
}
int count=0;
for(int k=0;k<len;k++)
{
if(numbers[k]==numbers[i])
count++;
}
if(count>len/2)
return numbers[i];
return 0;
}
};