当前位置: 首页 > news >正文

想要精通算法和SQL的成长之路 - 存在重复元素

想要精通算法和SQL的成长之路 - 存在重复元素

  • 前言
  • 一. 存在重复元素II
  • 二. 存在重复元素III
    • 2.1 基于红黑树增删改查

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 存在重复元素II

原题链接
在这里插入图片描述

思路:

  1. 我们用HashSet存储元素,做到去重的效果。同时存储的元素个数,固定在k个。这个HashSet相当于是一个滑动窗口了。
  2. 那么从左往右遍历,不断地往HashSet中塞元素,一旦超过容量,剔除滑动窗口最左侧元素。set.remove(nums[i - k - 1]);
  3. 遍历过程中,一旦发现当前元素存在于HashSet中,直接返回true即可。

代码如下:

public boolean containsNearbyDuplicate(int[] nums, int k) {HashSet<Integer> set = new HashSet<>();for (int i = 0; i < nums.length; i++) {// 滑动窗口只存储k个元素,超过了,则移除if (i > k) {set.remove(nums[i - k - 1]);}if (set.contains(nums[i])) {return true;}set.add(nums[i]);}return false;
}

二. 存在重复元素III

原题链接
在这里插入图片描述
我们先来一个最简单的思路,暴力法:

  1. 针对每个元素,作为滑动窗口的左边界。往后固定indexDiff长度的区间。
  2. 我们在[left,left+indexDiff] 区间内遍历数组,计算差值。如果满足差值 < valueDiff 值,说明找到满足条件的结果,返回true

但是,这种操作,有着大量的重复计算,而且数组的无规律性,在最坏的情况下,我们得遍历整个长度为 k 的区间数组。那咋办呢?

思路如下:

  1. 我们可以维护一个有序并且长度为 k 的滑动窗口。那么对于该区间的任意一个数字num。既然要满足差值 < valueDiff 值。那么在这个有序的集合当中。哪个数字最满足条件?
  2. 第一种:小于等于 num 的最大值。第二种:和大于等于num的最小值即值num左右两侧最靠近的数值是我们想要的。
  3. 那么对于有序的数组而言,想要查找上面两个数,用哪种方式最合适?二分法。
  4. 当然,我们还需要不断地维护这个滑动窗口对应的数据结构。

2.1 基于红黑树增删改查

下面来自百度百科的相关红黑树介绍:

  • 红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过若干次特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
  • 而这个特定操作,对于红黑树而言,可以限制到最多三次。
  • 它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的 n 是树中元素的数目。

针对上面的功能,红黑树都具备其查询:

  • 查询不超过num的最大值:floor函数。注意:如果找不到则返回null
  • 查询超过num的最小值:ceiling函数。注意:如果找不到则返回null

那么我们就不难写出代码:切记,对象和基本数据类型的比较,要判断null,否则会报空指针哦~

// floorNum <= num ,最大值
Long floorNum = tree.floor(num);
// ceilingNum >=num ,最小值
Long ceilingNum = tree.ceiling(num);
if (floorNum != null && num - floorNum <= valueDiff) {return true;
}
if (ceilingNum != null && ceilingNum - num <= valueDiff) {return true;
}

由于题目的元素值存在以下范围:
在这里插入图片描述
因此我们在存储的时候,要把它转成Long型。最终代码如下:

public boolean containsNearbyAlmostDuplicate(int[] nums, int indexDiff, int valueDiff) {TreeSet<Long> tree = new TreeSet<>();for (int i = 0; i < nums.length; i++) {// int 转 long,因为限制问题long num = nums[i] * 1L;// floorNum <= num ,最大值Long floorNum = tree.floor(num);// ceilingNum >=num ,最小值Long ceilingNum = tree.ceiling(num);if (floorNum != null && num - floorNum <= valueDiff) {return true;}if (ceilingNum != null && ceilingNum - num <= valueDiff) {return true;}tree.add(num);// 超过了滑动窗口大小if (i >= indexDiff) {tree.remove(nums[i - indexDiff] * 1L);}}return false;
}

相关文章:

想要精通算法和SQL的成长之路 - 存在重复元素

想要精通算法和SQL的成长之路 - 存在重复元素 前言一. 存在重复元素II二. 存在重复元素III2.1 基于红黑树增删改查 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 存在重复元素II 原题链接 思路&#xff1a; 我们用HashSet存储元素&#xff0c;做到去重的效果。同时存储…...

使用华为eNSP组网试验⑸-访问控制

今天练习使用华为sNSP模拟网络设备上的访问控制&#xff0c;这样的操作我经常在华为的S7706、S5720、S5735或者H3C的S5500、S5130、S7706上进行&#xff0c;在网络设备上根据情况应用访问控制的策略是一个网管必须熟练的操作&#xff0c;只是在真机上操作一般比较谨慎&#xff…...

iPhone苹果手机闹钟智能跳过节假日怎么设置?

国内绝大多数的手机用户使用的操作系统只有三个&#xff0c;安卓、鸿蒙和苹果的ios。而iPhone苹果手机的忠实用户是非常多的&#xff0c;所以日积月累中用户数量也就非常庞大&#xff0c;并且相当一部分用户都是上班族。而工作忙碌的上班族因为事情比较多&#xff0c;为了避免自…...

TenDB Cluster 简介

文章目录 1.简介2.TSpider3.TenDB4.Tdbctl5.TenDB Cluster Operator参考文献 1.简介 TenDB Cluster 是腾讯游戏 CROS DBA 团队提供的 MySQL 分布式关系型数据库解决方案。主要特点包括&#xff1a;透明分库分表、高可用的 MySQL 集群服务&#xff0c;透明及在线的扩容及缩容&a…...

【刷题笔记10.6】LeetCode:翻转二叉树

LeetCode&#xff1a;翻转二叉树 一、题目描述 给你一颗二叉树的根节点root&#xff0c;翻转这颗二叉树&#xff0c;并返回其根节点。 二、分析 我们在做二叉树题目时候&#xff0c;第一想到的应该是用 递归 来解决。 仔细看下题目的 输入 和 输出&#xff0c;输出的左右…...

【高阶数据结构】图详解第一篇:图的基本概念及其存储结构(邻接矩阵和邻接表)

文章目录 1. 图的基本概念1.1 什么是图1.2 有向图和无向图1.3 完全图1.4 邻接顶点1.5 顶点的度1.6 路径1.7 路径长度1.8 简单路径与回路1.9 子图1.10 连通图1.11 强连通图1.12 生成树 2. 图的存储结构2.1 邻接矩阵2.2 邻接矩阵代码实现结构定义构造函数添加边打印图测试 2.3 邻…...

IPV4跟IPV6的区别

如今互联网快速发展ipv4已经满足不了现在的需求&#xff0c;那么这时候就需要用更大的地址空间来代替&#xff0c;这时候ipv6就可以满足这一需求&#xff0c;相比ipv4它有更大的地址空间可供使用。下面我将分享一下有何区别。 IPv4与IPv6之间的区别: 1、地址长度的区别:IPv4具…...

利用fitnesse实现api接口自动化测试

上午在园子里乱逛&#xff0c;看了不少小伙伴们分享的接口测试方面的知识&#xff0c;仔细想想&#xff0c;我做接口测试也有几个年头了&#xff0c;大家所叙述到的一些经验或多或少&#xff0c;我也曾遇到过&#xff0c;突然意识到知识的点滴积累是多么的重要&#xff0c;我记…...

【LeetCode】1154.一年中的第几天

题目描述&#xff1a; 给你一个字符串 date &#xff0c;按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1&#xff1a; 输入&#xff1a;date "2019-01-09" 输出&#xff1a;9 解释&#xff1a;给定日期是2019年的第九天。示…...

4.物联网射频识别,RFID开发【智能门禁项目】

补充&#xff1a;学习路径 一。项目介绍及需求分析 1.酒店智能门禁使用场景介绍 1.客人入住 客人在前台办理入住手续&#xff0c;前台管理员通过门禁管理系统为客户开一张门禁卡 客户持卡到相应客房&#xff0c;用IC 卡刷卡开门 客人过了入住时间后&#xff0c;卡自动失效&a…...

CompletableFuture 和 Future 的选择,以及CompletableFuture的用法

在 Java 编程中&#xff0c;异步编程是一种重要的技术&#xff0c;它允许你在执行长时间运行的任务时不会阻塞主线程。为了支持异步编程&#xff0c;Java 提供了 Future 和 CompletableFuture 这两个关键的类。在本文中&#xff0c;我们将比较它们的特点、优缺点以及使用场景。…...

美国第三大财产和意外险公司利宝保险集团利用 OpenText EnCase 取证收集技术控制法律风险和成本

美国第三大财产和意外险公司利宝保险集团利用 OpenText EnCase 取证收集技术控制法律风险和成本 利宝保险集团通过内部取证收集技术控制法律风险和成本。OpenText EnCase Information Assurance&#xff08;以前称为 EnCase eDiscovery&#xff09;使保险公司巨头能够自信高效地…...

打包报错JavaScript heap out of memory

npm run build 的时候出现了Reached heap limit Allocation failed - JavaScript heap out of memory&#xff0c;报错信息如下图所示。 奇怪的时候这个报错信息在本地不会出现&#xff0c;通过jekins在服务器打包部署的时候才会出现。于是进入服务器执行下面一句代码&#xff…...

Android Camera FW 里的requestId和frameId

安卓相机frameworks里面经常出现requestId和frameId&#xff0c;最近简单看了一下代码&#xff0c;发现相关流程还是很复杂的&#xff0c;总结来看requestId 就是上层&#xff08;java&#xff09;发送的repeating(capture)请求的id&#xff0c;是从0开始递增的。 这是CameraD…...

代理IP与Socks5代理在技术世界的多元应用

在数字化时代&#xff0c;网络工程师的任务不仅是维护网络的稳定性&#xff0c;还需要应对各种技术挑战。代理IP与Socks5代理作为技术工具箱中的两把利器&#xff0c;在跨界电商、爬虫、出海业务、网络安全和游戏领域中发挥了关键作用。本文将深入探讨这两项技术在不同领域的多…...

计算机专业毕业设计项目推荐12-志愿者管理系统(Spring+Js+Mysql)

志愿者管理系统&#xff08;SpringJsMysql&#xff09; **介绍****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式&#xff0c;在编写的过程…...

苹果文件传到mac电脑用什么软件?

在数字化时代&#xff0c;文件传输已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;苹果用户在将手机文件传输到电脑时&#xff0c;往往会面临一些困扰。曾经的“文件传输助手”并不能完全满足用户的需求。于是&#xff0c;很多人开始寻找更便捷的解决方案。在本文中…...

深入理解Docker:简化部署与管理的利器

文章目录 引言Docker简介Docker的背景和发展Docker的优势和特点 Docker的基本概念和架构镜像&#xff08;Image&#xff09;容器&#xff08;Container&#xff09;仓库&#xff08;Repository&#xff09;Docker架构 Docker的常用命令和操作Docker的安装和配置Docker镜像的管理…...

软考对找工作有用吗?

软考是指软件技术专业资格考试&#xff0c;是由中国人力资源和社会保障部主管的一项国家级考试。软考的目标是评估和认证软件技术人员的专业能力&#xff0c;提高软件行业的整体素质和竞争力。那么&#xff0c;软考对找工作有用吗&#xff1f;本文将从以下几个方面进行分析。 首…...

Android系统启动之init进程启动+Zygote进程启动分析

一、基础概念理解 init进程 Android系统所有进程的祖先&#xff0c;是Android系统内核初始化完毕后&#xff0c;进入用户空间启动的第一个进程。 Android虚拟机 Dalvik虚拟机是谷歌自己设计的用于Android平台的虚拟机。Android4.4同时提供了Dalvik和ART虚拟机。Android5.0以后…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...