[配列]配列に半分以上出現する数

タイトル説明

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


ソート方法

配列を並べ替えます。特定の数の出現回数が配列の長さの半分を超える場合、その数は中央値に表示され、配列を1回トラバースして、出現回数が配列の半分より大きいかどうかを判断する必要があります。配列の長さ。

import java.util.Arrays;

public class Solution {
    
    
    public int MoreThanHalfNum_Solution(int[] array) {
    
    
        Arrays.sort(array);
        int res = array[array.length / 2];
        int count = 0;
        for (int i : array) {
    
    
            if (i == res)
                count++;
            if (count > array.length / 2)
                return res;
        }
        return 0;
    }
}

ハッシュ

ハッシュテーブルを使用して、値の出現回数を配列に格納します

import java.util.ArrayList;
import java.util.HashMap;

public class Solution {
    
    
    public int MoreThanHalfNum_Solution(int[] array) {
    
    
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        int len = array.length;
        for (int i = 0; i < len; i++) {
    
    
            hashMap.put(array[i], hashMap.getOrDefault(array[i], 0) + 1);
            if (hashMap.get(array[i]) > len / 2)
                return array[i];
        }
        return 0;
    }
}

最適なソリューション

配列内の出現回数が配列の長さの半分を超える場合、この数の出現回数は他のすべての数値の出現回数の合計を超えます.2つの変数count使用してres、の出現回数を記録できます。要素と要素の値。ここでは、回数は要素の実際の出現回数ではないことに注意してください。初期count=1, res=array[0]、現在の要素の値は、アレイを介して、及び場合resと同じであるcount++さもなければcount--、もしcount=0ときにres現在の要素の設定値、およびcount=1配列の長さの半分を超える要素がある場合、最後のres要素はこの要素である必要があります。count>0配列の他の要素よりも頻繁に表示されるため、0に減らされることcount>0はありません。もちろん、それは意味しません。res出現回数が配列の長さの半分を超える要素が配列内に存在しない可能性があるため、出現回数が配列の長さの半分を超えていることcount>0この時点でも満たすことができます。したがって、res出現回数が配列の長さの半分より大きいかどうかを判断するには、配列を再度トラバースする必要があります。

import java.util.ArrayList;

public class Solution {
    
    
    public int MoreThanHalfNum_Solution(int[] array) {
    
    
        int count = 1, res = array[0];
        for (int v : array) {
    
    
            if (count == 0) {
    
    
                count = 1;
                res = v;
            }
            if (v == res)
                count++;
            else
                count--;
        }
        count = 0;
        for (int v : array) {
    
    
            if (v == res) {
    
    
                count++;
                if (count > array.length / 2)
                    return res;
            }
        }
        return 0;
    }
}

おすすめ

転載: blog.csdn.net/weixin_43486780/article/details/113729506