LeetCode 295(1)

文章详细描述了一个使用AVL树的数据结构,包括Node类的构造方法和大小、高度计算,以及insert方法实现插入操作,特别关注了平衡调整(如右旋和左旋)。MedianFinder类利用IndexedAVL来找到中位数。

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{

newRoot = RL(t);

}

}

}else {

t.cnt++;

}

pushUp(newRoot);

return newRoot;

}

private int getItemByRank(Node node,int rank){

if(node == null) return Integer.MIN_VALUE;

if(getSize(node.left) >= rank) return getItemByRank(node.left,rank);

if(getSize(node.left)+node.cnt >= rank) return node.val;

return getItemByRank(node.right,rank-getSize(node.left)-node.cnt);

}

public int getItemByRank(int rank){

return getItemByRank(root,rank);

}

public void add(int value){

root = insert(root,value);

this.size++;

}

}

class MedianFinder {

/** initialize your data structure here. */

IndexedAVL avl;

public MedianFinder() {

avl = new IndexedAVL();

}

public void addNum(int num) {

avl.add(num);

}

public double findMedian() {

int size = avl.getSize();

if(size%2 != 0){

return avl.getItemByRank(size/2+1);

}else{

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

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。

[外链图片转存中…(img-ySZvgzNe-1713215224873)]

[外链图片转存中…(img-UKVmBUn6-1713215224873)]

[外链图片转存中…(img-UHbrAmQ5-1713215224874)]

[外链图片转存中…(img-1H6ialY8-1713215224874)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值