md_files/自学/草稿.md

1.7 KiB
Raw Blame History

  • 当然可以!下面是你可以直接记到笔记里的内容:


    🧠 题型:Top K 高频元素LeetCode 347

    题目描述:给定一个整数数组 nums 和一个整数 k,返回出现频率最高的前 k 个元素,返回顺序可以任意。


    📌 解法一:大根堆(最大堆)

    思路

    1. 使用 HashMap 统计每个元素的出现频率。
    2. 构建一个大根堆PriorityQueue + 自定义比较器),根据频率降序排列。
    3. 将所有元素加入堆中,弹出前 k 个元素即为答案。

    适合场景

    • 实现简单,适用于对全部元素排序后取前 k 个。
    • 时间复杂度:O(n log n),因为需要将所有 n 个元素都加入堆。

    📌 解法二:小根堆(最小堆)

    思路

    1. 使用 HashMap 统计频率。
    2. 构建一个小根堆,堆中仅保存前 k 个高频元素。
    3. 遍历每个元素:
      • 如果堆未满,直接加入。
      • 如果当前元素频率大于堆顶(最小频率),则弹出堆顶,加入当前元素。
    4. 最终堆中保存的就是前 k 个高频元素。

    适合场景

    • k ≪ n 时效率更高。
    • 时间复杂度:O(n log k),因为堆中最多维护 k 个元素。

    总结对比:

    方法 适合场景 时间复杂度 空间复杂度
    大根堆 k ≈ n简单易写 O(n log n) O(n)
    小根堆 k ≪ n更高效 O(n log k) O(n)

    需要我再写成代码模板笔记也可以,随时说!