トピックの説明
配列内に配列の長さの半分以上に出現する数値があります。この数値を見つけてください。たとえば、長さが 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;
}
}