码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 堆--数组中第K大元素


    如果对于堆不是太认识,请点击:堆的初步认识-CSDN博客

    解题思路:

    /**
     * 

    求数组中第 K 大的元素

    *

    * 解体思路 *

      * 1.向小顶堆放入前k个元素 * 2.剩余元素 * 若 <= 堆顶元素, 则略过 * 若 > 堆顶元素, 则替换堆顶元素 * 3.这样小顶堆始终保留的是到目前为止,前K大的元素 * 4.循环结束, 堆顶元素即为第K大元素 *
    */

    小顶堆(可删去用不到代码)

    1. class MinHeap {
    2. int[] array;
    3. int size;
    4. public MinHeap(int capacity) {
    5. array = new int[capacity];
    6. }
    7. private void heapify() {
    8. for (int i = (size >> 1) - 1; i >= 0; i--) {
    9. down(i);
    10. }
    11. }
    12. public int poll() {
    13. swap(0, size - 1);
    14. size--;
    15. down(0);
    16. return array[size];
    17. }
    18. public int poll(int index) {
    19. swap(index, size - 1);
    20. size--;
    21. down(index);
    22. return array[size];
    23. }
    24. public int peek() {
    25. return array[0];
    26. }
    27. public boolean offer(int offered) {
    28. if (size == array.length) {
    29. return false;
    30. }
    31. up(offered);
    32. size++;
    33. return true;
    34. }
    35. public void replace(int replaced) {
    36. array[0] = replaced;
    37. down(0);
    38. }
    39. private void up(int offered) {
    40. int child = size;
    41. while (child > 0) {
    42. int parent = (child - 1) >> 1;
    43. if (offered < array[parent]) {
    44. array[child] = array[parent];
    45. } else {
    46. break;
    47. }
    48. child = parent;
    49. }
    50. array[child] = offered;
    51. }
    52. private void down(int parent) {
    53. int left = (parent << 1) + 1;
    54. int right = left + 1;
    55. int min = parent;
    56. if (left < size && array[left] < array[min]) {
    57. min = left;
    58. }
    59. if (right < size && array[right] < array[min]) {
    60. min = right;
    61. }
    62. if (min != parent) {
    63. swap(min, parent);
    64. down(min);
    65. }
    66. }
    67. // 交换两个索引处的元素
    68. private void swap(int i, int j) {
    69. int t = array[i];
    70. array[i] = array[j];
    71. array[j] = t;
    72. }
    73. }

    题解

    1. public int findKthLargest(int[] numbers, int k) {
    2. MinHeap heap = new MinHeap(k);
    3. for (int i = 0; i < k; i++) {
    4. heap.offer(numbers[i]);
    5. }
    6. for (int i = k; i < numbers.length; i++) {
    7. if(numbers[i] > heap.peek()){
    8. heap.replace(numbers[i]);
    9. }
    10. }
    11. return heap.peek();
    12. }

    注意哦:求数组中的第 K 大元素,使用堆并不是最佳选择,可以采用快速选择算法

     

  • 相关阅读:
    美团外卖搜索基于Elasticsearch的优化实践
    项目实践---贪吃蛇小游戏(下)
    TypeScript配置文件设置详解
    什么测试自动化测试?
    【Linux】第六章 进程地址空间(程序在内存中存储+虚拟地址+页表+mm_struct+写实拷贝+解释fork返回值)
    数字电路学习
    【Java EE】Spring核心思想(一)——IOC
    电子邮件营销初学者指南(二):如何开始与撰写
    上门服务系统|上门服务小程序|上门服务软件开发
    搜索引擎-02-分词与全文索引
  • 原文地址:https://blog.csdn.net/m0_60333804/article/details/133582328
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号