数组中出现次数超过一半的数字
题:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:常规思路是先排序,(若有)取中间值即可,时间复杂度为O(nlogn)。定义两个变量,一个是数组中的一个数cur,一个为次数times。遍历到下一个数时,若这之前保存的数相同,则次数加1,若不同则见,若本次比较中times为0,则更新cur,同时times置1。最后若有超过数组长度一半的元素,则返回cur,没有则返回0,对于是否有,则只需再次遍历数组找到等于cur的个数,若个数超过数组一半,则有,否则没有。时间复杂度为O(n)。
代码如下:
1 class Solution { 2 public: 3 int MoreThanHalfNum_Solution(vector<int> numbers) 4 { 5 if(numbers.empty()) return 0; 6 int cur=numbers[0]; 7 int times=1; 8 int len=numbers.size(); 9 for(int i=1;i<numbers.size();++i) 10 { 11 if(times==0) 12 { 13 cur=numbers[i]; 14 times=1; 15 } 16 else if(cur==numbers[i]) 17 times++; 18 else 19 times--; 20 } 21 int totalRep=0; 22 for(int i=0;i<len;++i) 23 { 24 if(numbers[i]==cur) 25 totalRep++; 26 } 27 if(totalRep<=len/2) 28 return 0; 29 return cur; 30 } 31 };
注意要加上最后的判断。