1. 问题背景与理解
在通信系统中,信号传输过程中难免会出现误码现象。误码ID通常用数字表示,范围在1~65535之间。我们需要分析一个记录误码出现情况的数组,找出包含频度最高误码的最小子数组长度。
这个问题的实际意义在于:通过分析误码出现的分布情况,我们可以快速定位信号传输中最严重的干扰源所在的时间段。最小子数组长度代表了干扰最集中的时间窗口,这对通信系统的故障诊断和性能优化至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与算法设计
2.1 核心思路解析
要解决这个问题,我们需要分两步走:
- 统计每个误码出现的频度(次数)
- 对于频度最高的误码,找出它们出现位置的最小区间
关键点在于:
- 频度最高可能有多个误码(如示例中1和2都出现2次)
- 需要找到包含所有该误码出现位置的最小区间
2.2 算法选择与优化
我们采用哈希表(字典)来记录每个误码出现的位置索引,这种数据结构的选择基于以下考虑:
- 时间复杂度:O(n)遍历数组一次即可完成统计
- 空间复杂度:最坏情况下需要存储所有元素的索引,但题目给出数组长度≤1000,完全可接受
- 查找效率:哈希表的查找操作平均时间复杂度为O(1)
3. 代码实现与解析
3.1 JavaScript实现
javascript复制function getResult(arr) {
const idxs = {};
// 记录每个误码出现的所有位置索引
for (let i = 0; i < arr.length; i++) {
const code = arr[i];
idxs[code] ? idxs[code].push(i) : (idxs[code] = [i]);
}
let maxSize = 0;
let minLen = 0;
// 遍历所有误码的索引记录
for (let values of Object.values(idxs)) {
const size = values.length; // 当前误码的频度
const len = values.at(-1) - values.at(0) + 1; // 包含该误码的最小区间长度
// 更新最大频度和最小区间
if (size > maxSize || (size == maxSize && len < minLen)) {
maxSize = size;
minLen = len;
}
}
return minLen;
}
3.2 Java实现
java复制public static int getResult(int[] arr) {
HashMap<Integer, ArrayList<Integer>> idxs = new HashMap<>();
f
