Jianzhi - 配列内に半分以上出現する数値 - ハッシュマップの練習

トピックの説明

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

一連の考え

1. HashMap の使用を練習し、統計は終了です;
2. 並べ替え、中央値を取得します;
3. Invincible-Moore 投票方法。

ムーア投票方法:
投票の合計: モードの出現回数が配列の長さの半分を超えるため、モードの投票数が +1、非中程度の投票数が -1 の場合、その場合、すべての数値の投票の合計が 0 を超える必要があります。

投票の正および負のオフセット: 配列 nums のモードを x、配列の長さを n とします。num の最初の a 数値の投票の合計 = 0 の場合、配列内の最後の (na) 数値の投票の合計は依然として 0 > でなければなりません (つまり、最後の (na) 数値の最頻値は依然としてバツ)。

それは非常に明白な考えであり、それは真実です。

コード

1. ハッシュマップの練習。

import java.util.HashMap;
import java.util.Map;

class Solution {
    
    
	public static int majorityElement(int[] nums) {
    
    
        // 创建hashmap, 数-次数
		HashMap<Integer, Integer> hash = counter(nums);
        // 遍历,选出长度大于一半的
		int res = MapEntry(hash, nums);
		return res;
	}

	public static HashMap<Integer, Integer> counter(int[] nums) {
    
    
		HashMap<Integer, Integer> count = new HashMap<Integer, Integer>();
		for (int num : nums) {
    
    
			if (count.containsKey(num)) {
    
    
				int old_v = count.get(num);
				count.put(num, old_v + 1);
			} else {
    
    
				count.put(num, 1);
			}
		}
		return count;
	}

	public static int MapEntry(HashMap<Integer, Integer> hashmap, int[] nums) {
    
    

		int res = 0;
		for (Map.Entry<Integer, Integer> entry : hashmap.entrySet()) {
    
    
			
			if (entry.getValue() > (nums.length / 2)) {
    
    
				res = entry.getKey();
			}
		}
		return res;
	}
}

2. 並び替えを書かない;
3. ムーアの投票方法

class Solution {
    
    
    public int majorityElement(int[] nums) {
    
    
        int x = 0, votes = 0;
        for(int num : nums){
    
    
            if(votes == 0) x = num;
            votes += num == x ? 1 : -1;
        }
        return x;
    }
}

おすすめ

転載: blog.csdn.net/qq_32301683/article/details/108503321