タイトル説明
配列に配列の長さの半分以上の数字が含まれています。この数値を確認してください。たとえば、長さ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;
}
}