数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9 的数组{1,2,3,2,2,4,5,2}.由于数字2出现了5次,超过了数组长度的一半,因此输出2.若不存在,则输出0。

题解:
根据题目要求,可以通过多种方法进行测试。
1)排序—搜索法
首先对数组进行排序,相同数字位于连续的位置。因此,计算每个数字出现的次数,如果超过一半,则退出遍历,输出结果。若未超过一般,则计数重置为0,数字修改为下一数字。
代码如下:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int res=0;
        if(numbers.size()==0) return res;
        if(numbers.size()==1) return numbers[0];
        sort(numbers.begin(),numbers.end());
        int half=numbers.size()/2;
        int temp=numbers[0];
        int cnt=0;
        for(int i=0;i<numbers.size();i++){
            if(numbers[i]==temp)
                cnt++;
            if(numbers[i]!=temp){
                if(cnt<=half){
                    cnt=1;
                    temp=numbers[i];
                }
                else{
                    res=temp;
                    break;
                }
            }
        }
        return res;
    }
}

2)排序-中位法:
将数组进行排序,如果存在一个数字出现的次数是超过一半的,那么位于数组中间位置的数则必定是该数字,得到数字后,在进行遍历,若该数出现的次数超过长度一半,则输出。

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int res=0;
        if(numbers.size()==0) return res;
        if(numbers.size()==1) return numbers[0];
        sort(numbers.begin(),numbers.end());
        int half=numbers.size()/2;
        int temp=numbers[half];
        int cnt=0;
        for(int i=0;i<numbers.size();i++){
            if(numbers[i]==temp)
                cnt++;
            if(numbers[i]>temp){
                if(cnt>half){
                    res=temp;
                    break;
                }
                else break;
            }
        }
        return res;*/
    }
};

3)对抗法:
存在一个数出现次数超过数组长度的一半,那么若进行出现次数对抗(即若出现一个相同的数+1,不相同的数-1。出现次数为0时,将该位置的数重新作为对抗数),若存在对抗数,那么最终存活下来的数必定是该数。但,若刚好等于该数的一半次数。如长度为9,出现次数为4,则该数便不是。
代码如下:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int res=0;
        if(numbers.size()==0) return res;
        if(numbers.size()==1) return numbers[0];
        int temp;
        int cnt=0;
        for(int i=0;i<numbers.size();i++){
            if(cnt==0){
                temp=numbers[i];
                cnt=0;
            }
            if(numbers[i]==temp) cnt++;
            else if(numbers[i]!=temp) cnt--;
        }
        cnt=0;
        for(int i=0;i<numbers.size();i++)
            if(numbers[i]==temp)cnt++;
        if(cnt>numbers.size()/2)
            res=temp;
        return res;
    }
};
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐