• 堆--数组中第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 大元素,使用堆并不是最佳选择,可以采用快速选择算法

     

  • 相关阅读:
    提升C内功--函数栈帧的创建和销毁(动画讲解)
    Linux——权限
    【JAVA】【刷题子】1108.IP 地址无效化
    Stable Diffusion原理
    这短短 6 行代码你能数出几个bug?
    算法进阶-2sat-cf-1385G
    北京十大律师事务所(排名榜单2022版,胜诉率靠前)
    L3-006 迎风一刀斩
    1.计算机系统概述-王道考研计算机组成原理
    构建 Go 应用 docker 镜像的十八种姿势
  • 原文地址:https://blog.csdn.net/m0_60333804/article/details/133582328