LeetCode 295

/** initialize your data structure here. */

// qa 是小根堆,保存较大的一半

// qb 是大根堆,保存较小的一半

Queue qa,qb;

public MedianFinder() {

qa = new PriorityQueue<>();

qb = new PriorityQueue<>((x,y)->(y-x));

}

public void addNum(int num) {

if(qa.size() == qb.size()){

qb.add(num);

qa.add(qb.poll());

}else{

qa.add(num);

qb.add(qa.poll());

}

}

public double findMedian() {

if(qa.size() == qb.size()){

return (qa.peek()+qb.peek())/2.0;

}else{

return qa.peek();

}

}

}

  • 名次的AVL树

通过给AVL树的节点加上一个size、cnt域,实现可以通过名次搜索的AVL树。

具体的可以去看AVL的实现。(不过用在这道题目有点大材小用了)。

传送门

class IndexedAVL{

private static class Node{

// 节点存储的真实的数据

int val;

// size 是这节点统辖的树的节点的总个数,cnt这个节点存储val出现的次数, height是节点的高度

int size,cnt,height;

Node left,right;

public Node(int val) {

this.val = val;

this.cnt = this.height = this.size = 1;

}

}

private int size;

public int getSize() {

return size;

}

private Node root;

private int h(Node node){

return node==null?0:node.height;

}

private int getSize(Node p){

return p==null?0:p.size;

}

private void pushUp(Node p){

p.height = Math.max(h(p.left),h(p.right))+1;

p.size = p.cnt + getSize(p.left) + getSize(p.right);

}

// 右旋

private Node zig(Node p){

Node q = p.left;

p.left = q.right;

q.right = p;

pushUp§;

pushUp(q);

return q;

}

// 左旋

private Node zag(Node q){

Node p = q.right;

q.right = p.left;

p.left = q;

pushUp(q);

pushUp§;

return p;

}

private Node LL(Node t){

return zig(t);

}

private Node LR(Node t){

t.left = zag(t.left);

return zig(t);

}

private Node RR(Node t){

return zag(t);

}

private Node RL(Node t){

t.right = zig(t.right);

return zag(t);

}

private Node insert(Node t,int value){

if(t == null){

return new Node(value);

}

Node newRoot = t;

// 插入完成之后,要将搜索路径上的点依次进行调整 height,调整 size的大小

if(value < t.val){

t.left = insert(t.left,value);

int leftH = h(t.left);

int rightH = h(t.right);

if(leftH - rightH > 1){

// LL型

if(value <= t.left.val){

newRoot = LL(t);

// LR型

}else{

newRoot = LR(t);

}

}

}else if(value > t.val){

t.right = insert(t.right,value);

int leftH = h(t.left);

int rightH = h(t.right);

if(rightH -leftH >1){

// RR型

if(value >= t.right.val){

newRoot = RR(t);

// RL型

}else{

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

[外链图片转存中…(img-DzyKwDFN-1714868273702)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值