天天看点

剑指Offer(二十八):数组中出现次数超过一半的数字

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.empty()){
            return 0;
        }
        // 遍历每个元素,并记录次数;若与前一个元素相同,则次数加1,否则次数减1
        int result = numbers[0];
        int times = 1;
        for(int i = 1; i < numbers.size(); ++i){
            if(times == 0){
                // 更新result的值为当前元素,并置次数为1
                result = numbers[i];
                times = 1;
            }
            else if(numbers[i] == result){
                times++;
            }
            else{
                times--;
            }
        }
        // 判断result是否符合条件,即出现次数大于数组长度的一半
        times = 0;
        for(int i = 0; i < numbers.size(); ++i)
        {
            if(numbers[i] == result){
                times++;
            }
        }
        return (times > (numbers.size() >> 1)) ? result : 0;
    }
};
           
class Solution {//复杂度大一些
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int size=numbers.size();
        if(size==0){
            return 0;
        }
        for(int i=0;i<size;i++){
            int k=0;
            for(int j=0;j<size;j++){
                if(numbers[i]==numbers[j]){
                    k++;
                }
            }
            if(k>size/2){
                return numbers[i];
            }
        }
        return 0;
    
    }
};