アルゴリズム質問:配列内の数値質問の半分以上の分析

タイトル説明

配列に配列の長さの半分以上の数字が含まれています。この数値を確認してください。たとえば、長さ9の配列{1,2,3,2,2,2,5,4,2}を入力します。数値2は配列に5回出現し、配列の長さの半分以上であるため、2が出力されます。存在しない場合は0を出力します。

トピック分析

配列の半分以上を占める特定の数aがあるため、数aと他の数が互いに相殺される場合、少なくとも1つの数aを残すことができるため、この方法を使用できます。最初の数を最初に覚え、カウントを初期化します。 、後でトラバースすると、同じ数の場合はカウントが増加し(同じ数が重ね合わされます)、異なる場合はカウントが減少します(異なる数は互いに打ち消し合います)。例:
1,2,3,2,2,2,5,4,2
1:最初に記憶1、カウント= 1
2:記憶1と同じではない、カウントは0未満、記憶1を破棄
3:覚えて3、カウント= 1
2:破棄3、カウント= 0
2:記憶2、カウント= 1
2:記憶と同じ、カウント= 2
5:異なる、カウント= 1
4:異なる、カウント= 0、破棄2
2:覚えて2、カウント= 1、2
を取得

count = 0の場合、それは数が半分以下であり、答えがない必要があることを意味し
ます。count= 1の場合、異なる数が互いに打ち消し合い、得られる数が必ずしも半分を超えるとは限らないため、答えがある可能性があります。 1、2、3、4、5は5になりますが、5は要件を満たす答えではありません。
この時点で、取得した数値を配列に戻し、再度確認して、数値が要件を満たしているかどうかを確認します。
アルゴリズム全体の時間の複雑さはo(n)です。

コード

public int MoreThanHalfNum_Solution(int [] array) {
        if(array == null || array.length == 0){
            return 0;
        }
        int count = 0;
        int num = -1;//-1 不指向任何数
        for (int i = 0; i < array.length; i++) {
            if(array[i] == num){
                count++;
            } else if(num == -1){ //重新指向一个
                num = array[i];
                count++;
            } else{
                count--;
                if(count == 0){ //消除指向
                    num = -1;
                }
            }
        }
        if(count == 0) { //count == 0,一定没有满足要求的
            return 0;
        } else { //可能有,需要对num精确检查
            int numCount = 0;
            for (int i : array) {
                if(i == num)
                    numCount++;
            }
            if(numCount > array.length/2)
                return num;
            else
                return 0;
        }
    }

おすすめ

転載: blog.csdn.net/Baibair/article/details/108564642