220. 存在重复元素 III

news2024/9/21 2:18:53

220. 存在重复元素 III

  • 原题链接:
  • 完成情况:
  • 解题思路:
    • TreeSet
    • sequenceSet.ceiling
    • java中的红黑树
  • 参考代码:

原题链接:

220. 存在重复元素 III

https://leetcode.cn/problems/contains-duplicate-iii/description/

完成情况:

在这里插入图片描述

解题思路:

TreeSet

TreeSet

在这里插入图片描述

在Java中,TreeSet是Java集合框架中的一种实现类,它继承自AbstractSet类并实现了NavigableSet接口。TreeSet是一个有序的集合,它根据元素的自然顺序或者通过Comparator进行排序。

以下是TreeSet的主要特点:

  1. 有序性:TreeSet中的元素是有序的。默认情况下,元素按照它们的自然顺序进行排序。如果元素是自定义对象,可以通过Comparator接口实现自定义的排序方式。

  2. 不允许重复元素:TreeSet不允许插入重复的元素。如果试图插入一个已经存在的元素,插入操作将被忽略。

  3. 基于红黑树实现:TreeSet内部是通过红黑树(Red-Black Tree)数据结构来实现的。这使得查找、插入和删除操作的时间复杂度为O(log n)。

  4. 导航方法:TreeSet提供了一系列的导航方法,如获取第一个元素、最后一个元素、大于给定元素的最小元素、小于给定元素的最大元素等。

  5. 不支持null元素:TreeSet不支持存储null元素。如果试图插入null元素,将会抛出NullPointerException。

使用TreeSet时,元素必须实现Comparable接口(自然排序)或在创建TreeSet时提供Comparator来指定排序方式。

以下是使用TreeSet的简单示例:

import java.util.*;

public class TreeSetExample {
    public static void main(String[] args) {
        // 创建一个TreeSet来存储整数类型的元素
        TreeSet<Integer> numbers = new TreeSet<>();

        // 向TreeSet中添加元素
        numbers.add(5);
        numbers.add(2);
        numbers.add(8);
        numbers.add(1);
        numbers.add(3);

        // 打印TreeSet中的元素(有序)
        System.out.println(numbers); // 输出:[1, 2, 3, 5, 8]

        // 导航方法示例
        System.out.println("First element: " + numbers.first()); // 输出:First element: 1
        System.out.println("Last element: " + numbers.last());   // 输出:Last element: 8
        System.out.println("Greater than 4: " + numbers.higher(4)); // 输出:Greater than 4: 5
        System.out.println("Less than 3: " + numbers.lower(3));     // 输出:Less than 3: 2
    }
}

总结:TreeSet是一个有序的集合,适用于需要元素按照自然顺序或自定义排序方式进行排序的场景。由于其底层使用红黑树,查找、插入和删除操作具有较好的性能。但需要注意,TreeSet不支持存储null元素。

sequenceSet.ceiling

在Java的TreeSet中,ceiling() 方法用于返回集合中大于或等于给定元素的最小元素。它是NavigableSet接口中定义的一个方法,TreeSet实现了该接口。

方法签名为:

E ceiling(E e)

其中,E是集合中的元素类型。参数e是作为参考的元素,方法将返回TreeSet中大于或等于该元素的最小元素。如果不存在这样的元素,则返回null。

示例:

import java.util.*;

public class TreeSetExample {
    public static void main(String[] args) {
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(5);
        numbers.add(10);
        numbers.add(15);
        numbers.add(20);

        // 获取大于或等于8的最小元素
        Integer result1 = numbers.ceiling(8);
        System.out.println("Ceiling of 8: " + result1); // 输出:Ceiling of 8: 10

        // 获取大于或等于15的最小元素
        Integer result2 = numbers.ceiling(15);
        System.out.println("Ceiling of 15: " + result2); // 输出:Ceiling of 15: 15

        // 获取大于或等于25的最小元素(不存在)
        Integer result3 = numbers.ceiling(25);
        System.out.println("Ceiling of 25: " + result3); // 输出:Ceiling of 25: null
    }
}

在示例中,ceiling(8) 返回的结果是10,因为集合中大于或等于8的最小元素是10。ceiling(15) 返回的结果是15,因为15本身就是集合中的一个元素。而ceiling(25) 返回的结果是null,因为集合中没有大于或等于25的元素。

java中的红黑树

红黑树(Red-Black Tree)是一种自平衡二叉查找树,它在每个节点上都增加了一个额外的存储位来表示节点的颜色,可以是红色或黑色。这个颜色规则以及其他一些性质使得红黑树保持平衡,从而保证了查找、插入和删除操作的时间复杂度为 O(log n),其中 n 是树中节点的数量。

红黑树具有以下特性:

  1. 节点颜色:每个节点都是红色或黑色。
  2. 根节点和叶子节点:根节点是黑色的,叶子节点(空节点)是黑色的。叶子节点不存储数据,仅用于简化代码逻辑。
  3. 红色节点规则:红色节点的子节点必须是黑色的。
  4. 路径规则:从任意节点到其每个叶子节点的所有路径都包含相同数量的黑色节点。这个性质保证了树的平衡性。
  5. 插入规则:新插入的节点必须是红色的。然后,通过重新着色和旋转等操作来保持红黑树的性质。

红黑树的平衡性质保证了树的高度始终保持在 O(log n) 的范围内,因此查找、插入和删除等操作都可以在对数时间内完成,这使得红黑树在各种场景中都有广泛的应用。

在 Java 中,红黑树被广泛用于实现 TreeMapTreeSet。这些集合类在内部使用红黑树来维护有序性,并提供了高效的插入、删除和查找操作。

需要注意的是,红黑树虽然可以保持相对平衡,但并不是完美平衡的。因此,在某些情况下,其性能可能比平衡二叉搜索树(如 AVL 树)略差。但由于红黑树的平衡调整操作较为简单,所以通常在实践中更受欢迎。

参考代码:

package 中等题;

import java.util.TreeSet;

public class __220存在重复元素III__滑动窗口_有序集合 {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int indexDiff, int valueDiff){
        int n = nums.length;
        //-109 <= nums[i] <= 109
        TreeSet<Long> sequenceSet = new TreeSet<Long>();
        for (int i=0;i<n;i++){
            Long ceiling = sequenceSet.ceiling((long) (nums[i] - (long)valueDiff));
            if (ceiling != null && ceiling <= (long) nums[i] + (long)valueDiff){
                return true;
            }
            sequenceSet.add((long) nums[i]);
            if ( i >= indexDiff){
                sequenceSet.remove((long)nums[i-indexDiff]);
            }
        }
        return false;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/811936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ER系列路由器多网段划分设置指南

ER系列路由器多网段划分设置指南 - TP-LINK 服务支持 TP-LINK ER系列路由器支持划分多网段&#xff0c;可以针对不同的LAN接口划分网段&#xff0c;即每一个或多个LAN接口对应一个网段&#xff1b;也可以通过一个LAN接口与支持划分802.1Q VLAN的交换机进行对接&#xff0c;实现…

幅度调制与角度调制

文章目录 前言一、调制简介1、调制定义2、调制目的3、调制的分类 二、幅度调制&#xff08;线性调制&#xff09;1、幅度调制的一般模型2、常规双边带调幅 AM①、AM 信号的产生②、AM 调制器的模型③、AM 波形和频谱④、AM 信号的特点⑤、AM 包络检波⑥、调幅系数 3、抑制载波双…

Kotlin~Facade

概念 又称门面模式&#xff0c;为复杂系统提供简单交互接口。 角色介绍 Facade&#xff1a;外观类&#xff0c;供客户端调用&#xff0c;将请求委派给响应的子系统。SubSystem&#xff1a;子系统&#xff0c;独立的子设备或子类 UML 代码实现 class Light(val name: Strin…

Oracle 19c 报ORA-704 ORA-01555故障处理---惜分飞

异常断电导致数据库无法启动,尝试对数据文件进行recover操作,报ORA-00283 ORA-00742 ORA-00312错误,由于redo写丢失无法正常应用 D:\check_db>sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on 星期日 7月 30 07:49:19 2023 Version 19.3.0.0.0 Copyrig…

msvcp120.dll丢失的解决方法?哪种解决方法比较推荐?

msvcp120.dll是Microsoft Visual C Redistributable软件包的一部分。它是用于支持运行使用Microsoft Visual C编写的应用程序的动态链接库文件。msvcp120.dll提供了许多C标准库函数和组件&#xff0c;包括输入/输出、字符串处理、数学运算、内存管理等功能。 当您运行某个依赖于…

C++初阶——缺省参数以及函数重载

1. 缺省参数 缺省参数的分类&#xff1a;全缺省&#xff0c;半缺省 缺省参数是声明或定义函数时为函数的参数指定一个缺省值 在调用该函数时&#xff0c;若没有指定实参则采用该形参的缺省值否则使用指定的实参 void Func(int a 0) {cout<<a<<endl; }int main(…

nest的核心概念

请求进来 --- 中间件 --- 守卫 --- 拦截器 --- 通道 --- 处理&#xff08;controller层&#xff09; --- 拦截器 --- 返回 Pipe &#xff1a; 就是实现 PipeTransform 接口的 transform 方法&#xff0c;它的返回值就是传给 handler 的值。 ---------------------------------…

【Python数据分析】Python常用内置函数(二)

&#x1f389;欢迎来到Python专栏~Python常用内置函数&#xff08;二&#xff09; ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文…

Go语言进阶 + 依赖管理

依赖配置 - version开始&#xff0c;就开始很难听懂了&#xff0c;需要结合很多课后配套资料查阅很多文档和网站....然而好像没有那么多时间&#xff0c;一天给3小时学Go真的顶天了.....还有算法和Linux的Mysql... 这几天学Go已经把算法给挤掉了.....下步要权衡一下&#xff0c…

C#实现数据库数据变化监测(sqlservermysql)

监测数据库表数据变化&#xff0c;可实现数据库同步&#xff08;一主一从&#xff08;双机备份&#xff09;&#xff0c;一主多从&#xff08;总部数据库&#xff0c;工厂1&#xff0c;工厂2&#xff0c;工厂数据合并到总部数据&#xff09;&#xff09; sqlserver 启用数据库…

【Linux】网络基础

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统网络编程 文章目录 一、协议初识和网络协议分层&#xff08;TCP/IP四层模型&#xff09;认识协议TCP/IP五层&#xff08;或四层&#xff09;模型 二、认识MAC地址和IP地址认识MAC地址认识IP地址认…

什么是ssm?如何使用ssm进行后端开发

目录 一、ssm概述1.1 定义1.2 持久层框架 (mybatis&&mybatisPlus)1.3 Web 层框架 springMVC1.4 spring框架 二、开发结构2.1 config介绍2.2 controller介绍2.3 dao介绍2.4 domain介绍2.5 exception介绍2.6 interceptor介绍2.7 service介绍 三、注解开发介绍3.1 常见的注…

从零开始学Flask: 3分钟用Python快速构建Web应用

文章目录 一、背景二、安装&基础使用1. 安装 Flask2. 创建 Flask 应用3. 路由解析4. 模板渲染5. 请求和响应处理 三、Demo项目实战 一、背景 什么是Flask&#xff1f;Flask 是一个轻量级的 Python Web 应用框架&#xff0c;因其简单易用、灵活性高等特点&#xff0c;可以帮…

Ribbon源码

学了feign源码之后感觉&#xff0c;这部分还是按运行流程分块学合适。核心组件什么的&#xff0c;当专业术语学妥了。序章&#xff1a;认识真正のRibbon 但只用认识一点点 之前我们学习Ribbon的简单使用时&#xff0c;都是集成了Eureka-client或者Feign等组件&#xff0c;甚至在…

better scoll右 联左

这是先拿一个数组装进我们所有 获取到的dom节点的 高度 因为算的 都是 到最上面的 高度&#xff0c;所以我们 要减去他的 高度 就得到自身的高度 然后给右边加一个滚动事件&#xff0c;得到每一次滑动的高度&#xff0c;在循环上面的数组&#xff0c;就是我们右边的 y就在算出…

如何排查 IDEA 自身报错?| 以 IntelliJ IDEA 2023.1.4 无法刷新项目 Maven 模块的问题为例

这个问题是 2023 年 7 月 26 日遇到的&#xff0c;当时还是 IDEA 2023.1.4&#xff0c;结果文章还没写完&#xff0c;7 月 27 日自动给更新了 IDEA 2023.2。问题估计解决了。 所以&#xff0c;本文就简单提一下 IDEA 自身报错的排查方法。 规避/解决方式 先说问题怎么处理&am…

重生之我要学C++第五天

这篇文章主要内容是构造函数的初始化列表以及运算符重载在顺序表中的简单应用&#xff0c;运算符重载实现自定义类型的流插入流提取。希望对大家有所帮助&#xff0c;点赞收藏评论&#xff0c;支持一下吧&#xff01; 目录 构造函数进阶理解 1.内置类型成员在参数列表中的定义 …

糟了,数据库主从延迟了!

前言 在实际的生产环境中&#xff0c;由单台MySQL作为独立的数据库是完全不能满足实际需求的&#xff0c;无论是在安全性&#xff0c;高可用性以及高并发等各个方面 因此&#xff0c;一般来说都是通过集群主从复制&#xff08;Master-Slave&#xff09;的方式来同步数据&…

【点云处理教程】05-Python 中的点云分割

一、说明 这是我的“点云处理”教程的第 5 篇文章。“点云处理”教程对初学者友好&#xff0c;我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。 在上一教程中&#xff0c;我们看到了如何过滤点云以减少噪声或其密度。在本教程中&#xff0c;我们将应用一些聚…

LeetCode_11. 盛最多水的容器

题目描述 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/container-with-most-water/ 思路分析 这题就是典型的是一道很经典的面试题&#xff0c;最优的解法是双指针&#xff0c;但很多人在第一次看到这题的时候很难想到用双指针来…