數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。因爲數字2在數組中出現了5次,超過數組長度的一半,所以輸出2。若是不存在則輸出0。java
能夠先假設數組中有超過數組長度一半的元素,找到這個元素,而後再驗證。數組
對數組進行排序,若是有一個數字出現的次數超過數組長度的一半,那麼這個元素必定是數組長度/2索引位置的那個元素,再遍歷數組,統計出現的次數是否大於一半便可。spa
還能夠利用投票法,當下一個元素與上一個元素相同時,計數+1,不一樣時計數-1,計數爲0時從新記錄數字,若是存在超過一半的元素,那麼就必定是最後所記錄的元素,一樣的遍歷數組驗證一下就能夠了。code
C++blog
class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { int count = 0; int res = 0; for(int num:numbers){ if(count == 0) res = num; if(num == res) count++; else count--; } count = 0; for(int num:numbers){ if(num == res) count++; } return count > numbers.size()/2 ? res : 0; } };
class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { sort(numbers.begin(), numbers.end()); int count = 0; int mid = numbers.size() / 2; for(int nums:numbers){ if(nums == numbers[mid]) count++; } return count > mid ? numbers[mid] : 0; } };
Java排序
import java.util.*; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { int count = 0; int mid = array.length / 2; Arrays.sort(array); for(int num:array){ if(num == array[mid]) count++; } return count > mid ? array[mid] : 0; } }