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

这篇具有很好参考价值的文章主要介绍了找出乱序数组第k大的数字(堆排序专场)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用堆排序来解决《乱序数组第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;
}

}`

比较有收获的几个点:文章来源地址https://www.toymoban.com/news/detail-620915.html

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

到了这里,关于找出乱序数组第k大的数字(堆排序专场)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 剑指 Offer 56 - II. 数组中数字出现的次数 II(位运算 / 哈希表 / 排序)

    链接:剑指 Offer 56 - II. 数组中数字出现的次数 II 难度:中等 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。 示例 1: 输入:nums = [3,4,3,3] 输出:4 示例 2: 输入:nums = [9,1,7,9,7,9,7] 输出:1 限制: 1 = nums.length = 10000 1

    2024年02月13日
    浏览(30)
  • 每天一道leetcode:剑指 Offer 53 - I. 在排序数组中查找数字 I(适合初学者&二分查找)

    统计一个数字在排序数组中出现的次数。 0 = nums.length = 10^5 -10^9 = nums[i] = 10^9 nums 是一个非递减数组 -10^9 = target = 10^9 使用两次二分查找找到target在数组中的左右边界,然后长度就是右边界减去左边界再加一,最后返回长度即可。   欢迎大家在评论区讨论,如有不懂的代码部分

    2024年02月14日
    浏览(44)
  • 新增长100人研讨会:快消零售专场探讨招商加盟数字化转型实战

    2024年2月2日下午,一场由纷享销客与杨国福集团联合主办的招商加盟数字化转型研讨会在上海成功举办。本次研讨会汇聚了众多快消零售业界的领军人物,共同探讨行业未来的新增长点。 会议伊始,杨国福集团数字化中心负责人王林林发表了主题演讲,深入剖析了杨国福在招

    2024年02月21日
    浏览(27)
  • C++ 缓存再排序,解决多线程处理后的乱序问题,不知道思路对不对[挠下巴]

    使用map默认会根据key排序的原理作缓存,队列满了依次推出,抛弃掉过时的数据

    2024年02月14日
    浏览(30)
  • 编程练习【找出数组中的幸运数】

    在整数数组中,如果一个整数的出现频次和它的数值大小相等,我们就称这个整数为「幸运数」。 给你一个整数数组 arr,请你从中找出并返回一个幸运数。 如果数组中存在多个幸运数,只需返回 最大 的那个。 如果数组中不含幸运数,则返回 -1 。 示例 1: 输入:arr = [2,2

    2024年02月09日
    浏览(32)
  • 找出数组中最小K个数【最小堆】

    面试题 17.14. 最小K个数 - 力扣(LeetCode) 设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 示例: 提示: 0 = len(arr) = 100000 0 = k = min(100000, len(arr))

    2024年02月11日
    浏览(28)
  • leetcode 215.数组中第k大的元素

    🌟 leetcode链接:数组中第k大的元素 思路: 使用堆数据结构,大堆的堆顶是堆内最大的元素,也就是把当前堆 pop k - 1 次,第 k 次 top 出来的元素就是第 k 大的数。 代码:

    2024年02月09日
    浏览(39)
  • 【基础算法】[PTA]-找出不是两个数组共有的元素

    找出不是两个数组共有的元素 题目描述: 解题思路: 【整体思路】:在两个整型数组中,找出不是两者共有的元素,意思就是既要在第一个数组中找出第二个数组中没有出现的元素,也要在第二个数组中找出第一个数组中没有出现的元素。所以这里可以每个数组做一次主体

    2024年02月04日
    浏览(30)
  • 2023全云在线联合微软AIGC专场沙龙:人工智能与企业创新,促进创造力的数字化转型

    6月29日,由全云在线平台和微软联合主办的人工智能与企业创新:促进创造力的数字化转型——2023AIGC微软专场沙龙在广州天河区正佳万豪酒店举行。 关于2023AIGC微软专场沙龙 GPT翻开了AGI新的一页,也翻开了各行各业的新篇章。 2022年11月30日 Open AI 的 ChatGPT 3.5 预训练大模型发

    2024年02月12日
    浏览(28)
  • Matlab | 找出数组/向量中的重复项的索引

    输入一个数组,里面含有重复项,想要将其重复的项的序号指示出来。 unique()函数可以去除数组的重复项,并且返回索引。我们可以利用这个返回的索引,进而找出原数组中重复出现的位置。 贴了两份代码,第一份输出形式数组,第二份输出形式是元胞。

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包