首页 > 其他分享 >大根堆

大根堆

时间:2024-08-07 23:16:49浏览次数:9  
标签:大根堆 smallHeap return idx int len cmp

/*

  • @lc app=leetcode.cn id=215 lang=java
  • [215] 数组中的第K个最大元素
    */

// @lc code=start
class Solution {
private int[] smallHeap;
int len = 0;

void swap(int idx1, int idx2) {
    int tmp = smallHeap[idx1];
    smallHeap[idx1] = smallHeap[idx2];
    smallHeap[idx2] = tmp;
}

boolean cmp(int idx1, int idx2) { return smallHeap[idx1] > smallHeap[idx2]; }

void heapify(int idx) {
    if (idx < 0 || idx >= len) return;
    int l = (idx << 1) | 1, r = (idx << 1) + 2;
    if (l >= len) return;
    if (r == len) {
        if (cmp(idx, l))
            swap(idx, l);
        return;
    }
    if (cmp(l, idx) && cmp(r, idx)) return;
    int swapIdx = (cmp(idx, l) && cmp(r, l)) ? l : r;
    swap(swapIdx, idx);
    heapify(swapIdx);
}

int poll() {
    int res = smallHeap[0];
    smallHeap[0] = smallHeap[--len];
    smallHeap[len] = 0;
    heapify(0);
    return res;
}

int peek() { return smallHeap[0]; }

void add(int x) {
    int idx = len;
    smallHeap[len++] = x;
    while(idx > 0 && cmp(idx >> 1, idx)) {
        swap(idx >> 1, idx);
        idx >>= 1;
    }
}

public int findKthLargest(int[] nums, int k) {
    smallHeap = new int[nums.length];
    for (int i = 0; i < k; ++i) add(nums[i]);
    for (int i = k; i < nums.length; ++i) {
        if (nums[i] > peek()) {
            add(nums[i]);
            poll();
        }
    }

    return peek();
}

}
// @lc code=end

标签:大根堆,smallHeap,return,idx,int,len,cmp
From: https://www.cnblogs.com/FlyingLight/p/18348058

相关文章

  • 大根堆和小根堆的介绍
    堆(Heap)的基本概念堆是一种完全二叉树(CompleteBinaryTree),其性质使得堆可以高效地支持以下操作:插入(Insert):将一个新元素加入到堆中。删除最大/最小元素(DeleteMax/Min):移除并返回堆中的最大(大根堆)或最小(小根堆)元素。获取最大/最小元素(GetMax/Min):返回堆中的最大(大根堆)或最小(小......
  • 【数据结构】大根堆和小根堆
    大根堆实现逻辑从整棵树的最后一颗子树开始调整,每次都让根节点和左右孩子去比较,如果根节点比左右孩子的最大值要小,那么就将这两个值进行交换,然后此时这颗子树变成了大根堆,再看下一颗树然后对下一颗树进行相同的处理方法,后面的子树依次交换:当每棵子树都是大根堆的情况......
  • 大根堆的实现
    publicstaticvoidswap(int[]arr,inti,intj){arr[i]=arr[i]^arr[j];arr[j]=arr[i]^arr[j];arr[i]=arr[i]^arr[j];}//建一个大根堆publicstaticclassMyMaxHeap{privateint[]heap;privatefinalintlimit;privateinthea......
  • set 容器详解 附大根堆题解
    声明本文中题解部分内容大部分转载自@sonnety的这篇博客中,本文为为方便复习而写的结论类文章,读者可自行跳转至原文处阅读。PART1set什么是set——来源cppreference简言之,它就是一种存进去就可以自动按升序排列的特殊容器,通常的set还具有自动去重的功能。定义方......
  • 【堆排序】(大根堆)
    敬信仰赤诚,敬少年滚烫的情钟voidheapify(inta[],intn,inti){//根据当前节点i进行堆调整,保证以i为根节点的子树符合最大堆的性质intlargest=i;//假设当前节点为最大值的索引intleft=2*i+1;//计算左孩子节点索引intright=2*......
  • Ybt 金牌导航 6.1.F 大根堆 / BZOJ 4919 大根堆(LIS,启发式合并)
    题意简述有一个以\(1\)为根的有根树,每个点有权值\(v_i\)。你需要选出一个点集\(S\),使得点集里任意两个元素\(x,y\),若\(x\)在原树上是\(y\)的祖先,则要满足\(v_x>v_y\)。求选出的点集的最大大小是多少。解法原题限制相当于:在选出的点集构成的新树\(T\)中,每个点到根节......
  • 大根堆和小根堆
    #include<iostream>usingnamespacestd;inth[1000000];intz=0;//z表示数列中有几个元素voidup(intx){ while(x>1&&h[x]<h[x/2]){ swap(h[x],h[x/2]); x/=2; }}voiddown(intx){ while(x*2<=z){ intt=x*2; if(t+1<=z&&......
  • 大根堆/小根堆
    #include<iostream>#include<algorithm>#include<vector>#include<queue>#include<random>#include"util.h"usingnamespacestd;structPoint{intx,y;//priority_queue<Point>大根堆需要重载小于号boolo......
  • python 大根堆
    python默认的都是小根堆,实现数字的大根堆,可在堆化前把数字乘以-1,输出时再乘以-1变回原值。比如:[5,20,6],堆化前用列表推导式把列表转为: [-5,-20,-6]importheapqimportrandomdata=list(range(1,30))random.shuffle(data)#打乱顺序data=data[:12]#......
  • 大根堆和小根堆在海量数据的top N问题中,时间复杂度O(nlogN)
    堆可视化操作演示:https://visualgo.net/zh/heap堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:小根堆:Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者大根堆Key[i]>=Key[2i+1]&&key>=key[2i+2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大根堆......