デジタル数(C ++詳細なオファーを獲得)複数のアレイの半分以上が表示され

デジタル数(C ++詳細なオファーを獲得)複数のアレイの半分以上が表示され
私はこの質問を見たのは初めて、単に、爆発ではなく、そのsort関数行シーケンスを感じるの中央値を取って、ないOK、それに再びトラバースの数をカウントするには?しかし、インタビューの中で、ソートあなた自身を達成するためになるかもしれない、またはご質問が尋ねていること:配列入力、それを修正することができませんか?
(パーティション関数に基づいて)最初の方法
注:この方法の修正入力配列

コアは:以上の数字の出現回数の半分よりも、中央の図を発注した後は確かにあります

問題解決のアイデア:パーティション機能により、配列内のランダムに選択された要素(私のコードのデフォルトでは、配列の最初の要素である)、そして速いのアイデアによってランク付け、小さな要素は、ランダムな値が、大きな要素の前に移動ランダムな値をバックに移動し、その後、ランダム値の最終的な位置を返します。インデックス>中旬、中央値の説明、左端=半ば1、インデックス<半ば、右への説明の場所、開始した場合ならば、インデックス値との判断を返すための値で、関数を呼び出すことにより、パーティション=中旬1、最終的には最も数が表示されて半ば、と数字[中期]に等しく、そして最終的にチェック機能により、数が半分に表示され配列を超えているかどうかを判断するまで

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers)
    {
        int length = numbers.size();
        if (length <= 0)//判空
            return 0;
        int start = 0;
        int end = length - 1;
        int index = Partition(numbers, start, end);//Partition函数随机值在数组中的位置
        int mid = length >> 1;//统计学的中位数
        while (index != mid)//随机值与中位数位置的判等
        {
            if (index>mid)
            {
                end = index - 1;
                index = Partition(numbers, start, end);
            }
            else if (index<mid)
            {
                start = index + 1;
                index = Partition(numbers, start, end);
            }
        }
        if (!Check(numbers, numbers[index]))//判断次数是否超过一半
            return 0;
        return numbers[index];
    }
    int Partition(vector<int> num, int start, int end)
    {
        int index = start;
        int sum = num[start];//默认随机值为首位,这里可以用“随机函数”
        //从第二位开始
        for (int i = start + 1; i<end; ++i)
        {
            if (num[i]<sum)
            {
                ++index;
                swap(num[i], num[index]);
            }
        }
        swap(num[start], num[index]);//随机值居中(左小右大)
        return index;
    }
    bool Check(vector<int> num, int result)
    {
        int count = 0;
        for (int i = 0; i<num.size(); ++i)
        {
            if (num[i] == result)
                ++count;
        }
        if (count * 2>num.size())
            return true;
        return false;
    }
};

第二の方法(カウント法)
注:この方法は、入力配列を変更しません

コア:他のすべての桁よりデジタル倍以上の数の半分以上の到来少なくとも1以上

問題解決のアイデア:最初から最初の(番号[0] ==なる)、同じ要素、カウント++遭遇回数== 0、結果は、現在の要素に再割り当てするとき、彼らは同じ要素、count--、ではありませんアレイトラバーサルが完了した後、結果を返すまで、1をカウントするために再割り当て

疑問?我々は結果は要素の最大数が表示され、要素のさえ最大数が表示され、私は例えば、複数のアレイの半分以上かどうかわからないかどうかを判断できないため、今、それらを判断し、なぜ、チェック機能を呼び出す:{5,5,5,5 、3,3,3,4,4,4,4,5,5,5,5,5} {5,3,3,3,4,4,4,4}

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.size()<=0)
            return 0;
        int result=numbers[0];
        int i=1;
        int count=1;
        for(;i<numbers.size();++i)
        {
            if(count==0)
            {
                result=numbers[i];
                count=1;
            }
            else if(result==numbers[i])
                ++count;
            else
                --count;
        }
        if(!Check(numbers,result))
                result=0;
        return result;
    }
    bool Check(vector<int> num,int result)
    {
        int count=0;
        for(int i=0;i<num.size();++i)
        {
            if(num[i]==result)
                ++count;
        }
        if(count*2>num.size())
            return true;
        return false;
    }

おすすめ

転載: blog.51cto.com/14233078/2469750