2276统计区间的整数数目

文章探讨了如何使用数据结构如TreeMap和红黑树高效地统计区间内的整数数目,对比了暴力遍历和官方解法,并解析了红黑树的原理及在插入过程中的调整策略。

1. 题目:统计区间中的整数数目

2276. 统计区间中的整数数目

给你区间的 集,请你设计并实现满足要求的数据结构:

  • **新增:**添加一个区间到这个区间集合中。
  • **统计:**计算出现在 至少一个 区间中的整数个数。

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 要求

在这里插入图片描述

一颗红黑树必须满足一下几点要求:

  1. 树中每个节点必须是有颜色的,要么红色,要么黑色;
  2. 树中的根节点必须是黑色的;
  3. 树中的树尾的NIL节点或者为null的节点必须是黑色的;
  4. 树中任意一个节点如果是红色的,那么它的两个子节点一点是黑色的;
  5. 任意节点到叶子节点的每一条路径所包含的黑色节点数目一定相同;

科普:NIL节点是就是一个假想的或是无实在意义的节点,所有应该指向NULL的指针,都看成指向了NIL节点,包括叶节点的子节点指针或是根节点的父指针(均是指向null的)

红黑树节点的结构:包含以下几个属性

在这里插入图片描述

4.4.3 红黑树节点添加

在将一个节点插入到红黑树中,首选需要将红黑树当做一颗二叉树查找树来对待,将节点进行插入。然后,为新插入的节点进行着色;最后,通过旋转和重新着色的方式来修正树的平衡,使其成为一颗红黑树;

(1)对于红黑树来说,其底层依旧是一颗二叉查找树。当我们插入新的元素时,它依旧会对该元素进行排序比较,将其送入到左子树或者是右子树中。

(2)在将新节点安置好以后,在对其进行着色处理,必须着成红色

为什么要着成红色,而不是黑色呢?——当将新增节点着成红色后,我们违背以上红黑树的要求的条数最少,恢复平衡起来最省事

后,在对其进行着色处理,必须着成红色

为什么要着成红色,而不是黑色呢?——当将新增节点着成红色后,我们违背以上红黑树的要求的条数最少,恢复平衡起来最省事

Java集合–TreeMap完全解析 - 简书 (jianshu.com)

### 如何在编程中实现区间统计频次 为了实现在特定区间的频率统计,可以采用多种方式。一种常见的方式是利用Python中的`numpy.histogram()`函数来计算数值落在指定范围内的次数。这种方法不仅简单而且高效。 下面是一个具体的例子: ```python import numpy as np def interval_frequency(data, bins): """ 统计给定数据集中各元素落入不同区间(由bins定义)的数量 参数: data (list or array): 输入的一维数据列表或数组. bins (int or sequence of scalars): 如果为整数,则表示要创建的bin数目; 若为序列,则给出bin边缘的位置. 返回: tuple: 包含两个元素, 第一个是各个区间的频数, 第二个是用于划分这些区间的边界值组成的数组. """ counts, edges = np.histogram(data, bins=bins) return counts, edges[:-1] # 示例用法 data_points = [0.7, 1.3, 2.5, 3.6, 4.8, 5.9, 6.2, 7.4, 8.6, 9.7] interval_edges = [0, 3, 6, 9, 12] # 定义四个区间:(0-3], (3-6], (6-9], (9-12] frequencies, intervals = interval_frequency(data_points, interval_edges) for i in range(len(frequencies)): print(f'Interval ({intervals[i]}, {interval_edges[i + 1]}]: Frequency={frequencies[i]}') ``` 此代码片段展示了如何通过自定义函数`interval_frequency`来进行区间内频度的统计工作,并打印出每个区间的具体分布情况[^1]。 对于更复杂的应用场景,可能还需要考虑其他因素,比如处理缺失值、异常点检测以及优化性能等问题。此外,在某些情况下,也可以借助Pandas库提供的功能更加便捷地完成此类任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值