1. 题目:统计区间中的整数数目
给你区间的 空 集,请你设计并实现满足要求的数据结构:
- **新增:**添加一个区间到这个区间集合中。
- **统计:**计算出现在 至少一个 区间中的整数个数。
2. 自身解法
很暴力,遍历每一个数组,用set接收,返回set的大小,最后显示空间不足
3. 官方解法
-
用到了
TreeMap
,之前没用过,查了一下,主要是为了使用这个方法:Map.Entry<K,V> floorEntry(K key)
方法,返回值:小于或等于key的条目,如果没有这样的键,则返回null
-
其次,对于解法中
while
循环的理解(我最开始认为if
就可以满足要求,不需要while
),但是会有这种情况
4. 知识点解析
4.1. TreeMap
TreeMap
是一个能比较元素大小的Map集合,底层是红黑树结构,会对传入的key
进行了大小排序。其中,可以使用元素的自然顺序(也是相当于实现了Comparator
),也可以使用集合中自定义的比较器来进行排序
TreeMap
具有如下特点:
- 不允许出现重复的
key
; - 可以插入
null
键,null
值; - 可以对元素进行排序;
- 插入和遍历顺序不一致;
常用的方法:Java.util.TreeMap 类 (w3schools.cn)
4.2 二叉搜索树
平衡二叉搜索树(AVL)详解_二叉检索树avl树-优快云博客
4.3 平衡二叉搜索树 AVL
树(因发明人得名)
平衡二叉搜索树(AVL)详解_二叉检索树avl树-优快云博客
4.4 红黑树
4.4.1 含义
红黑树,本质上依旧一颗二叉查找树,它满足了二叉查找树的特点,即左子树任意节点的值永远小于右子树任意节点的值。
AVL树
用左右子树的高度差来保持着树的平衡。红黑树,用的是节点的颜色来维持树的平衡。
4.4.2 要求
一颗红黑树必须满足一下几点要求:
- 树中每个节点必须是有颜色的,要么红色,要么黑色;
- 树中的根节点必须是黑色的;
- 树中的树尾的NIL节点或者为null的节点必须是黑色的;
- 树中任意一个节点如果是红色的,那么它的两个子节点一点是黑色的;
- 任意节点到叶子节点的每一条路径所包含的黑色节点数目一定相同;
科普:NIL节点是就是一个假想的或是无实在意义的节点,所有应该指向NULL的指针,都看成指向了NIL节点,包括叶节点的子节点指针或是根节点的父指针(均是指向null的)
红黑树节点的结构:包含以下几个属性
4.4.3 红黑树节点添加
在将一个节点插入到红黑树中,首选需要将红黑树当做一颗二叉树查找树来对待,将节点进行插入。然后,为新插入的节点进行着色;最后,通过旋转和重新着色的方式来修正树的平衡,使其成为一颗红黑树;
(1)对于红黑树来说,其底层依旧是一颗二叉查找树。当我们插入新的元素时,它依旧会对该元素进行排序比较,将其送入到左子树或者是右子树中。
(2)在将新节点安置好以后,在对其进行着色处理,必须着成红色
为什么要着成红色,而不是黑色呢?——当将新增节点着成红色后,我们违背以上红黑树的要求的条数最少,恢复平衡起来最省事
后,在对其进行着色处理,必须着成红色
为什么要着成红色,而不是黑色呢?——当将新增节点着成红色后,我们违背以上红黑树的要求的条数最少,恢复平衡起来最省事