【题目描述】
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
【原题重现:2016 腾讯C/C++研发工程师】
春节期间小明使用微信收到很多红包,非常开心。在查看领取红包的记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包的金额。写出具体算法思路和代码实现,要求算法尽可能高效。
【解题思路】
两两比较,发现不一样则丢弃掉(做上标记),否则则保留,最终留下来的就一定是总数超过一半的那个数了。
【代码实现】
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 class Solution { 7 public: 8 int MoreThanHalfNum_Solution(vector<int> numbers) { 9 if (numbers.size() == 0) 10 return 0; 11 if (numbers.size() == 1) 12 return numbers.front(); 13 vector<int> num(numbers); 14 int len = num.size() % 2 ? num.size() - 1 : num.size(); 15 for (int i = 1; i < len; i+=2) 16 { 17 if (num[i - 1] != num[i]) 18 num[i - 1] = num[i] = -1; 19 } 20 21 for (int i = 0; i < len; i++) 22 { 23 if (num[i]>0) 24 { 25 return num[i]; 26 } 27 } 28 return 0; 29 } 30 }; 31 32 33 int main(void) 34 { 35 Solution *s = new Solution(); 36 vector <int> vec{ 1, 2, 3, 2, 4, 2, 5, 2, 3 }; 37 cout << s->MoreThanHalfNum_Solution(vec) << endl; 38 system("pause"); 39 return 0; 40 }