https://www.nowcoder.net/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:
勉强做出来了,但是最后一步还是参考了别人的。就是关于怎么检验这个数字出现的次数的确是超过了一半,而不是没有解的结果,我没有什么思路。看了别人的。
别人有好几种解法,我觉得partition的思路还是很不错的。
那么我自己,其实用的是消去法。能解出结果,不过最后是需要再O(n)检查一下这个结果的确合法。
我的代码如下:
class Solution { public: int MoreThanHalfNum_Solution(vector<int> xx) { vector<int> numbers = xx; int n = numbers.size(); while (n > 1) { int y = 0; for (int x = 0; x < n/2; ++x) { if (numbers[2*x] == numbers[2*x+1]) { numbers[y++] = numbers[2*x]; } } if (n == n/2*2+1) { numbers[y++] = numbers[n-1]; } n = y; } int cnt = 0; for (int i=0; i<xx.size(); ++i) { if (xx[i] == numbers[0]) cnt++; } if (cnt > xx.size() / 2) return numbers[0]; else return 0; } };