適用於非負整數陣列且已知最大值的場景,利用計數陣列(Counting Sort 思想)實現 O(n) 時間、O(max) 空間統計。
import java.util.*;
public class ArrayStats {
/**
* 找出陣列中出現次數最多的元素及其次數
* @param array 目標陣列(非負整數)
* @param maxVal 陣列中可能的最大值(用於分配計數陣列大小)
* @return Map: "value"->眾數, "maxCount"->出現次數
*/
public static Map<String, Integer> findMode(int[] array, int maxVal) {
Map<String, Integer> result = new HashMap<>();
result.put("value", 0);
result.put("maxCount", 0);
if (array == null || array.length == 0 || maxVal < 0) return result;
try {
int[] counter = new int[maxVal + 1];
for (int v : array) {
if (v >= 0 && v <= maxVal) counter[v]++;
}
int mode = 0, maxCount = 0;
for (int i = 0; i <= maxVal; i++) {
if (counter[i] > maxCount) {
maxCount = counter[i];
mode = i;
}
}
result.put("value", mode);
result.put("maxCount", maxCount);
} catch (Exception ignored) {}
return result;
}
}
int[] data = {3, 5, 2, 3, 8, 3, 5, 9, 3};
Map<String, Integer> r = ArrayStats.findMode(data, 9);
System.out.println("眾數: " + r.get("value") + ", 次數: " + r.get("maxCount"));
// 輸出: 眾數: 3, 次數: 4
| 限制 | 替代方案 |
|---|---|
| 需知最大值、且最大值不能過大(記憶體) | 改用 Map<Integer, Long> 計數,空間 O(不同值數) |
| 不支援負數 | 偏移量處理:counter[v + offset]++ |
| 多個眾數僅回傳第一個 | 回傳 List<Integer> 所有最大計數值 |