1、基本概念

  所谓自平衡二叉树,就是当我们插入或删除元素之后,二叉树的高度会自动调整到最小,这样我们就可以在对数时间内查找二叉树内的元素。

2、定义

TreeSet<Elemtype> set=TreeSet<>();

3、基本函数

set.ceiling(x)    // 取set中大于等于x的最小值,没有就返回空
set.floor(x) // 取set中小于等于x的最大值,没有就返回空
set.size() // 返回树的大小
set.remove() // 移除树中元素
set.add() // 向树中添加元素

 

4、运用——LeetCode220题

题目描述:给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 k。

输入: nums = [1,2,3,1], k = 3, t = 0
输出: true

分析:对于这道题,我们最主要的就是运用滑动窗口,然后查找窗口内的值是否满足要求。而对于查找问题,我们使用自平衡二叉树,就可以在对数级别内实现。

算法:用自平衡二叉树保存窗口里面的值。

  • 如果树中大于等于x的最小值s,s<=x+t ,则返回true
  • 如果树中小于等于x的最大值g,x<=g+t ,则返回true
  • 将x存入树中,当树中元素大于窗口大小k,则删除最小进入树中的元素,循环直到结束。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contains-duplicate-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
  TreeSet<Integer> set=new TreeSet<>();
  for(int i=0;i<nums.length;++i){
    Integer s=set.ceiling(nums[i]);
    if(s!=null && s<=nums[i]+t) return true;
    Integer g=set.floor(nums[i]);
    if(s!=null && nums[i]<=g+t) return true;
    set.add(nums[i]);
    if(set.size()>k){
      set.remove(nums[i-k]);
    }
  }
  return false;
}

待续未完...

Java数据结构系列(1)——自平衡二叉树的更多相关文章

  1. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

  2. Java数据结构系列之——栈(2):栈的链式存储结构及其操作

    package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList&l ...

  3. java数据结构系列——排列(2):有序阵列

    package Array; /** * 对数组排序.当添加到阵列保持有序数组元素: * @author wl * */ public class MyOrderArray { private lon ...

  4. java数据结构系列之——数组(1)

    import javax.management.RuntimeErrorException; public class MyArray { private long array[]; private ...

  5. Java数据结构系列——简单排序:泡、选择、直接进入

    package SimpleSort; public class SimpleSort { /** * 冒泡排序:每次循环过程中.小的排在后面的数会像水中的 * 气泡一样慢慢往上冒,所以命名为冒泡排序 ...

  6. 自己动手实现java数据结构(一) 向量

    1.向量介绍 计算机程序主要运行在内存中,而内存在逻辑上可以被看做是连续的地址.为了充分利用这一特性,在主流的编程语言中都存在一种底层的被称为数组(Array)的数据结构与之对应.在使用数组时需要事先 ...

  7. 《java数据结构与算法》系列之“开篇”

    大学的时候学习数据结构,当时吧虽然没挂这门课,但是确实学的不咋地,再但是其实自己一直都觉得数据结构很重要,是基础,只有基础好了,后面的路才能走的更好. 懒惰真的是天下的罪恶之源.所以一直到现在都毕业了 ...

  8. Java 集合系列 12 TreeMap

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  9. 一文掌握关于Java数据结构所有知识点(欢迎一起完善)

    在我们学习Java的时候,很多人会面临我不知道继续学什么或者面试会问什么的尴尬情况(我本人之前就很迷茫).所以,我决定通过这个开源平台来帮助一些有需要的人,通过下面的内容,你会掌握系统的Java学习以 ...

随机推荐

  1. react项目使用antd

    在开始实践之前要确保搭建React单页面开发环境,如果还没有搭建好开发环境的朋友请移步到如何搭建React单页面开发环境. 首先在命令行模式下创建一个React项目(项目名使用小写字母命名):(win ...

  2. bootstrap:导航分页

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  3. 【转】ArcGIS Server 10.1 动态图层

    ArcGISServer将GIS资源以服务的方式发布,能够让更多的人在Web上浏览.使用.不过,诸如气象.环保等方面的信息是实时变化的,按照之前常规的方法,我们先要将最新获得的信息组织成地图文档后再对 ...

  4. 【转】分布式服务框架 Zookeeper -- 管理分布式环境中的数据

    Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理 ...

  5. 我与Git的那些破事系列(下)--分支模型

    在上篇文章中,我提到了Git的基本概念和一些本人实际项目中的总结.然而,最近读了一片Vincent Driessen写的一篇文章,觉得他总结的太好了,忍不住站在他的肩膀上写一篇自己的理解.文章的连接放 ...

  6. MySql笔记(一)

    目录 MySql笔记(一) 每天给自己一个希望,努力做好自己,不为明天烦恼,不为昨天叹息.当梦想还在,告诉自己:努力,就总能遇见更好的自己! MySql笔记(一) 1.创建数据库以及删除 1.创建数据 ...

  7. numpy 读取数据

    一.CSV文件 CSV: Comma-Separated Value,逗号分隔值文件 显示:表格状态 源文件:换行和逗号分隔,逗号 列,换行 行 二.读取数据 1.方法 loadtxt(fname, ...

  8. redis 数据类型之列表

    1.lpush lpush(name,values) # 在name对应的list中添加元素,每个新的元素都添加到列表的最左边 # 如: # conn.lpush('oo', 11,22,33) # ...

  9. cors中间件

    class MiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_respon ...

  10. ElasticSearch 倒排索引简析

    内容概要 倒排索引是什么?为什么需要倒排索引? 倒排索引是怎么工作的? 1. 倒排索引是什么? 假设有一个交友网站,信息表如下: 美女1:"我要找在上海做 PHP 的哥哥." 需要 ...