由于有一个数字在数组中出现的次数超过了一半。则我们每次都选出两个不同的数字,将其从数组中去掉,直到数组中只剩下一个数,或多个相同的数,就是要找的众数。
实际操作中,使用一个变量candi保存当前准备比较的数,用一个变量count保存这个准备比较的数还剩多少个才能完全从数组中去掉。每次比较时,若count为0,说明需要选出第一个数,准备与另一个不同的数一同从数组中去掉。当count不为0,若当前数与candi数相等,则count++,说明candi数又重复了一次,需要count++次才能从数组中完全去除。当当前数不等于candi时,count--,表明将该数与一个candi从数组中去除。最终candi保存的数就是需要寻找的众数。

空间复杂度O(1),时间复杂度O(n)。

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int candi = 0;
        int count = 0;
        for(int i = 0;i < numbers.size();i++){
            if(count == 0){
                candi = numbers.at(i);
                count++;
            }
            else if(candi == numbers.at(i)){
                count++;
            }
            else{
                count--;
            }
        }
        return candi;
    }
};