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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
]
[外链图片转存中…(img-wsoVpLOc-1715795342322)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!