数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
该数存在,等价于,删去该数的个数恰为子数组长度一半的子数组,将其余部分为新数组,则该数在新数组中的个数依然过半,即
freq>21len⇔freq−21subLen>21(len−subLen)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { if (numbers.size() == 0) { return 0; } else { int target = numbers[0]; int counter = 0; for (const int number: numbers) { if (number == target) { counter++; } else { counter--; if (counter == -1) { target = number; counter = 1; } } } if (counter > 0) { int real_counter = 0; for (const int number: numbers) { if (number == target) { real_counter++; } } if (real_counter > numbers.size() / 2) { return target; } else { return 0; } } else { return 0; } } } };
|