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

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

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

方法一

思路:直白的想法,先排序,然后判断前一半的数,看其中有没有一个数k,等于他后边half位置之后的数,有则返回数k,无则返回0

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int len = numbers.size();
        if(len<=0)
            return 0;
        if(len == 1)
            return numbers[0];

        int half = len/2;//出现次数大于half才算

        //先排序
        //冒泡吧
        for(int i = 0;i<len -1;i++)
            for(int j = 0;j<len-1-i;j++)
            {
            if(numbers[j] > numbers[j+1])
                {
                int temp = numbers[j];
                numbers[j]=numbers[j+1];
                numbers[j+1]=temp;
            }
        }

        //遍历当前位置i后half的位置
        for(int k =0;k<half;k++)//只用判断数组的前一半,节省时间
            {
            if(numbers[k] == numbers[k+half])//因为是有序的数组,再次节约时间
                return numbers[k];
        }
        return 0;
    }
};

方法二:俗称“打擂”算法

思路:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> a) {
      int x, cnt = 0;
        for(int i = 0; i < int(a.size()); ++i){
            if(cnt == 0 || a[i] == x) x = a[i], cnt++;
            else --cnt;
        }
        cnt = 0;
        for(int i = 0; i < int(a.size()); ++i) if(a[i] == x) ++cnt;
        return (cnt * 2 > a.size() ? x : 0);
    }
};

你可能感兴趣的:(排序,数组)