找出一个数组中,出现超过半数的元素。
怎么做呢?分而治之,两人分组,如果两个相同,就保留,否则都不要。最后如果多出来一个,也保留。
具体情况就是:
抽屉原理:
假设现在有2k个数,然后elem至少有k+1个。
把k+1个数,放到k个抽屉里,一定会有重复的。
比如: 1, 2, 1, 2, 1, 2, 1
如果现在有2k + 1个数,那么elem至少有k+1个。
如果这k+1个数,都在前2k个数里面,那么分析同上一条。
如果这k+1个数,只有k个在前2k个数里面,那么最后的第k+1个数就是那个重复的数。
现在怎么把这个数找出来呢?
两两归并,如果一致,就留下来,如果不一致就都丢掉,如果最后有剩余的,也留下来。最后肯定会留下那个数
class Solution { public: int majorityElement(vector<int>& a) { int j; while(a.size() > 1) { j = 0; for(int i = 0; i + 1 < a.size(); i+=2) { if(a[i] == a[i+1]) { a[j++] = a[i]; } } if(a.size() % 2) { a[j++] = a.back(); } a.resize(j); } return a[0]; } };