JS题解LeetCode1051高度检查器:哈希表与排序对比

作者:半夏时间:2026-10-26 08:22:12浏览:149

本文详解LeetCode第1051题“高度检查器”的两种JavaScript解法。方法一利用哈希表(数组)统计高度频次,通过一次遍历记录最小值,二次遍历比对当前高度与期望最小高度,统计不匹配数量,实现O(n)时间复杂度。方法二则直接对数组排序后逐位对比,代码简洁但涉及排序开销。文章通过代码对比展示了两种思路在实现复杂度与执行效率上的差异,帮助开发者理解计数排序思想在实际问题中的应用。

解题思路

解题思路

方法一的核心在于,我们实际上无需对 heights 数组进行完整排序。只需从前向后遍历数组,判断当前位置上的元素是否等于“当前应该出现的最小数字”。

为此,我们创建一个数组来存储所有出现数字的频次。鉴于题目限制 heights 的最大长度为 100,直接创建一个长度为 100 的数组,利用下标直接保存计数器即可。若长度不定或较大,则需通过 Map 处理并对 Map 进行排序。

首先遍历 heights,在数组中记录所有数字出现的次数,同时找出最小值作为后续判断的起始下标。接着再次遍历 heights,判断当前遍历到的元素是否与目标下标一致。若不一致,结果计数器加 1;若一致则忽略,并将对应下标的计数器减 1。当计数器归零时,说明该高度的所有实例已处理完毕。

如果当前下标对应的计数器值为 0,意味着 heights 中该数值的出现次数已耗尽。此时直接迭代寻找下一个计数器不为 0 的下标,继续后续判断即可。

方法二相对简单,直接对 heights 数组进行排序,然后逐位与原数组对比,统计不同位置的个数。

代码

/**
 * @param {number[]} heights
 * @return {number}
 */
var heightChecker = function (heights) {
  const arr = new Array(100).fill(0)
  let t = 0
  let idx = 101
  heights.forEach(item => {
    arr[item]++
    if (item < idx) idx = item
  })
  heights.forEach(item => {
    if (item !== idx) {
      t++
    }
    arr[idx]--
    while (arr[idx] === 0) {
      idx++
    }
  })
  return t
};
​​​​​​​var heightChecker = function (heights) {
  const h = JSON.parse(JSON.stringify(heights))
  const arr = heights.sort((a, b) => a - b)
  let t = 0
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] !== h[i]) t++
  }
  return t
};

以上就是js题解LeetCode1051 高度检查器哈希表对比的详细内容,更多关于js高度检查器哈希表对比的资料请关注本站其它相关文章!

作者最新文章