题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
链接:
思路:
神奇的一道题,思路完全来自剑指offer。
一个数的个数要超过数组的一半,即其个数大于len/2,那么其他数的总个数要小于这个数的总个数,一对一消除后,最后的个数肯定要大于0(肯定会有不小于2的这个数是连续出现的)
如果存在这个数,一对一消除后得到的数必然为此数,但是考虑到可能不存在这个数,那么最后遍历一次数组,判断这个数的个数是否真大于len/2
用快排的方法也可以解决,就是排序的数正好在中间的时候,就是这个数了(如果存在的话),不存在的话,遍历一次统计次数即可。
代码:
1 class Solution { 2 public: 3 int MoreThanHalfNum_Solution(vector<int> numbers) { 4 int len = numbers.size(); 5 if(len < 1){ 6 return 0; 7 } 8 9 if(len == 1){ 10 return numbers[0]; 11 } 12 13 int num = numbers[0]; 14 int cnt = 1; 15 for(int index = 1; index < len; ++ index){ 16 if(cnt == 0){ 17 num = numbers[index]; 18 } 19 20 if(numbers[index] == num){ 21 ++ cnt; 22 }else{ 23 -- cnt; 24 } 25 } 26 27 if(cnt == 0){ 28 return 0; 29 } 30 cnt = 0; 31 for(int index = 0; index < len; ++ index){ 32 if(numbers[index] == num){ 33 ++ cnt; 34 } 35 } 36 37 return cnt > (len >> 1) ? num : 0; 38 } 39 };
浙公网安备 33010602011771号