首页 > 其他分享 >找出乱序数组第k大的数字(堆排序专场)

找出乱序数组第k大的数字(堆排序专场)

时间:2023-08-01 15:15:11浏览次数:29  
标签:专场 nums int 堆排序 heapSize largest root 节点 乱序

使用堆排序来解决《乱序数组第k大的数字》
先放上代码(虽然leetcode要求O(n),但是堆排序是O(nlogn))
`class Solution {
public int findKthLargest(int[] nums, int k) {
int heapSize = nums.length;
buildHeap(nums, heapSize);
for(int i = nums.length - 1; i >= nums.length - k + 1; i--) {
swap(nums, 0, i);
heapSize--;
buildHeap(nums, heapSize);
}
return nums[0];
}

public void buildHeap(int[] nums, int heapSize) {
    for(int i = heapSize / 2 - 1; i >= 0; i--) {
        maximum(nums, i, heapSize);
    }
}

public void maximum(int[] nums, int root, int heapSize) {
    int lChild = root * 2 + 1;
    int rChild = root * 2 + 2;
    int largest = root;

    if (lChild < heapSize && nums[lChild] > nums[largest]) {
        largest = lChild;
    }
    if (rChild < heapSize && nums[rChild] > nums[largest]) {
        largest = rChild;
    }
    // 如果largest不再是入参那个根节点,说明有子节点比它大,要换,换了之后继续往下递归看还有没有
    if (largest != root) {
        swap(nums, root, largest);
        maximum(nums, root, largest);
    }
}

public void swap(int[] nums, int a, int b) {
    int temp = nums[a];
    nums[a] = nums[b];
    nums[b] = temp;
}

}`

比较有收获的几个点:

  • 堆里面儿子节点是父亲节点n的n2+1和n2+2
  • 删除堆的堆顶是通过把堆顶元素和堆最后的元素交换,并且heapSize--来实现的
  • 如果有儿子节点比父亲节点大,那么需要交换父亲节点和这个儿子节点,并且继续将交换之后新的儿子节点作为新的根节点往下递归判断
  • 可以从heapSize/2这个节点开始判断,并不断--,最后得到的数组[0]就是正确的堆顶,进行进一步处理即可

标签:专场,nums,int,堆排序,heapSize,largest,root,节点,乱序
From: https://www.cnblogs.com/cspzyy/p/17596537.html

相关文章

  • 网工内推 | 坐标上海,IT工程师专场,IE认证优先
    01洛阳栾川钼业集团股份有限公司招聘岗位:IT工程师(网络)职责描述:1.负责集团全球网络的监控、运维、规划。2.负责集团总部网络信息安全监控及维护工作。3.具备网络问题的独立分析思路,能够独立进行问题解决,可完成常见的网络问题解决。4.负责公司所有网络设备、安全设备的正常安全运转......
  • java常见的排序算法(冒泡排序、选择排序、插入排序、shell排序、归并排序、堆排序、快
    文章目录一、冒泡排序1、效率表现和适用范围2、算法实现二、选择排序1、效率表现和适用范围2、算法实现三、插入排序1、效率表现和适用范围2、算法实现四、shell排序1、效率表现和适用范围2、算法实现五、归并排序1、效率表现和适用范围2、算法实现六、快速排序1、效率表现和适用......
  • 保护 TDengine 查询性能——3.0 如何大幅降低乱序数据干扰?
    在时序数据库(TimeSeriesDatabase)场景下,乱序数据的定义为:“时间戳(timestamp)不按照递增顺序到达数据库的数据。”虽然它的定义很简单,但时序数据库需要有相应的处理逻辑来保证数据存储时的顺序性,这势必会增加数据库架构的复杂性,从而影响数据库的性能表现。已知完全乱序的数据处理是......
  • Codeforces Round #885 数学专场
    妙,我只能说妙。今天补DEF发现除了F诡秘的杨辉三角,我都能独立做出来。但为什么我感觉DE难度不如C!!!!A题意:一个人站在\((x,y)\)处,而其他人分别在\((x_1,y_1)\dots(x_n,y_n)\),每一次这个人先移动一步到上下左右四个格子,然后其他\(n\)个人再移动一步,求是否永远这个人与其他人不......
  • 2021年中国大学生程序设计竞赛女生专场
    链接:https://codeforces.com/gym/103389A.公交线路C++Code#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn,x,y;cin>>n>>x>......
  • 【优先队列】【堆排序实现优先队列】[1054. 距离相等的条形码](https://leetcode.cn/p
    【优先队列】【堆排序实现优先队列】1054.距离相等的条形码在一个仓库里,有一排条形码,其中第i个条形码为barcodes[i]。请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。你可以返回任何满足该要求的答案,此题保证存在答案。示例1:输入:barcodes=[1,1,1,2,2,2]......
  • 读取MySQL中JSON文本会乱序
    如何读取MySQL中的JSON文本并保持顺序当我们在MySQL数据库中存储JSON文本时,有时候我们可能希望能够读取到与存储时相同的顺序。然而,由于MySQL的JSON类型是无序的,存储和读取时会导致JSON文本的顺序丢失。在本文中,我将向你展示如何通过使用MySQL内置函数和一些额外的代码来解决这个......
  • 7.17~7.18 DP专场
    CF1814EChainChips好久没写这种题了~~不带修时,为了让总距离和最短,考虑让相邻的车互换位置,但如果单纯这样有可能剩下一辆车,那就让相邻的三辆车换一下。发现当车的个数\(x\ge4\)时,都可以拆成\(2\)辆或\(3\)辆车。对应到边就是只能选相邻的一条边或两条边。设\(dp_i\)......
  • 堆排序之前篇:关于堆
      1. 堆的定义和性质堆是一种特殊的数据结构,它是一颗完全二叉树,且满足以下性质:堆中某个节点的值总是不大于或不小于其父节点的值。如果父节点的值不大于其子节点的值,这样的堆称为最小堆;如果父节点的值不小于其子节点的值,这样的堆称为最大堆。堆可以用数组来存储,因为......
  • 24届秋招专场 · 数组如何用双指针解题呢?
    你好,我是安然无虞。文章目录删除有序数组中的重复项删除排序链表中的重复元素移除元素移除零大家好,近期主要更新数组相关的解题算法咯,感兴趣的老铁可以一起看过来啦。今天更新使用双指针解决数组部分题型,注意哦,这里所说的双指针不是C语言中“指针”的概念,指的是数组的索引下标,......