找出一个数组中,出现超过半数的元素。

 

怎么做呢?分而治之,两人分组,如果两个相同,就保留,否则都不要。最后如果多出来一个,也保留。

 

具体情况就是:

抽屉原理:

 

假设现在有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];
    }
};

 

posted on 2019-05-17 16:47  newbird2017  阅读(74)  评论(0编辑  收藏  举报