【LeetCode每日一题】——220.存在重复元素 III

ops/2024/12/18 20:11:00/

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时空频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

二【题目难度】

  • 困难

三【题目编号】

四【题目描述】

  • 给你一个整数数组 nums 和两个整数 indexDiffvalueDiff
  • 找出满足下述条件的下标对 (i, j)
    • i != j,
    • abs(i - j) <= indexDiff
    • abs(nums[i] - nums[j]) <= valueDiff
  • 如果存在,返回 true ;否则,返回 false

五【题目示例】

  • 示例 1

    • 输入:nums = [1,2,3,1], indexDiff = 3, valueDiff = 0
    • 输出:true
    • 解释:可以找出 (i, j) = (0, 3) 。
      • 满足下述 3 个条件:
        • i != j --> 0 != 3
        • abs(i - j) <= indexDiff --> abs(0 - 3) <= 3
        • abs(nums[i] - nums[j]) <= valueDiff --> abs(1 - 1) <= 0
  • 示例 2

    • 输入:nums = [1,5,9,1,5,9], indexDiff = 2, valueDiff = 3
    • 输出:false
    • 解释:尝试所有可能的下标对 (i, j) ,均无法满足这 3 个条件,因此返回 false 。

六【题目提示】

  • 2 < = n u m s . l e n g t h < = 1 0 5 2 <= nums.length <= 10^5 2<=nums.length<=105
  • − 1 0 9 < = n u m s [ i ] < = 1 0 9 -10^9 <= nums[i] <= 10^9 109<=nums[i]<=109
  • 1 < = i n d e x D i f f < = n u m s . l e n g t h 1 <= indexDiff <= nums.length 1<=indexDiff<=nums.length
  • 0 < = v a l u e D i f f < = 1 0 9 0 <= valueDiff <= 10^9 0<=valueDiff<=109

七【解题思路】

  • 本题如果使用暴力方法很明显会超时,所以我们利用哈希表来完成桶排序
    • 桶排序思想:将元素按值划分到不同的桶中,确保同一桶内的元素值差不超过 valueDiff。
    • 桶大小:每个桶的大小设置为 valueDiff + 1。
    • 桶ID计算:通过 x / (valueDiff + 1) 来计算元素 x 所属的桶ID。
    • 相邻桶检查:检查当前桶以及相邻桶内的元素,保证值差不超过 valueDiff。
    • 索引范围检查:确保当前元素与桶内其他元素的索引差不超过 indexDiff,超出范围则删除过期元素。
  • 最后返回结果即可
  • 具体细节可以参考下面的代码

八【时空频度】

  • 时间复杂度: O ( n ) O(n) O(n) n n n为传入的数组的长度
  • 空间复杂度: O ( n ) O(n) O(n) n n n为传入的数组的长度

九【代码实现】

  1. Java语言版
class Solution {// 根据给定的valueDiff计算当前值x所在的区间IDprivate long getId(long x, long valueDiff) {if (x >= 0) {// 正数的区间ID为x / (valueDiff + 1)return x / (valueDiff + 1);} else {// 负数的区间ID为(x + 1) / (valueDiff + 1) - 1,处理负数时偏移1以保证负数的ID正确return (x + 1) / (valueDiff + 1) - 1;}}// 判断是否存在两个元素,其索引差小于等于indexDiff,值的差小于等于valueDiffpublic boolean containsNearbyAlmostDuplicate(int[] nums, int indexDiff, int valueDiff) {int n = nums.length;Map<Long, Long> map = new HashMap<>();// 哈希表用于存储每个区间ID对应的最新元素值// 遍历数组中的每个元素for (int i = 0; i < n; i++) {long x = nums[i];   // 当前元素值long id = getId(x, valueDiff);  // 获取当前元素所属的区间ID// 如果当前元素的索引超出范围,移除之前索引差超过indexDiff的元素if (i - (indexDiff + 1) >= 0) {map.remove(getId(nums[i - (indexDiff + 1)], valueDiff));}// 检查当前区间ID是否已经存在相同的元素,若存在则返回trueif (map.containsKey(id)) {return true;}// 检查相邻的区间ID是否存在符合条件的元素// 区间ID为id-1,若存在并且两者差值小于等于valueDiff,则符合条件if (map.containsKey(id - 1) && Math.abs(map.get(id - 1) - x) <= valueDiff) {return true;}// 区间ID为id+1,若存在并且两者差值小于等于valueDiff,则符合条件if (map.containsKey(id + 1) && Math.abs(map.get(id + 1) - x) <= valueDiff) {return true;}// 如果都没有找到符合条件的元素,则将当前元素放入哈希表map.put(id, x);}// 如果没有找到符合条件的元素,返回falsereturn false;}
}
  1. Python语言版
class Solution:# 根据给定的valueDiff计算当前值x所在的区间IDdef get_id(self, x, valueDiff):if x >= 0:# 正数的区间ID为x / (valueDiff + 1)return x // (valueDiff + 1)else:# 负数的区间ID为(x + 1) / (valueDiff + 1) - 1,处理负数时偏移1以保证负数的ID正确return (x + 1) // (valueDiff + 1) - 1# 判断是否存在两个元素,其索引差小于等于indexDiff,值的差小于等于valueDiffdef containsNearbyAlmostDuplicate(self, nums: List[int], indexDiff: int, valueDiff: int) -> bool:n = len(nums)map = {}    # 哈希表用于存储每个区间ID对应的最新元素值# 遍历数组中的每个元素for i in range(n):x = nums[i] # 当前元素值id = self.get_id(x, valueDiff)  # 获取当前元素所属的区间ID# 如果当前元素的索引超出范围,移除之前索引差超过indexDiff的元素if i - (indexDiff + 1) >= 0:del map[self.get_id(nums[i - (indexDiff + 1)], valueDiff)]# 检查当前区间ID是否已经存在相同的元素,若存在则返回Trueif id in map:return True# 检查相邻的区间ID是否存在符合条件的元素# 区间ID为id-1,若存在并且两者差值小于等于valueDiff,则符合条件if (id - 1) in map and abs(map[id - 1] - x) <= valueDiff:return True# 区间ID为id+1,若存在并且两者差值小于等于valueDiff,则符合条件if (id + 1) in map and abs(map[id + 1] - x) <= valueDiff:return True# 如果都没有找到符合条件的元素,则将当前元素放入哈希表map[id] = x# 如果没有找到符合条件的元素,返回Falsereturn False
  1. C++语言版
class Solution {
public:// 根据给定的valueDiff计算当前值x所在的区间IDlong getId(long x, long valueDiff) {if (x >= 0) {// 正数的区间ID为x / (valueDiff + 1)return x / (valueDiff + 1);} else {// 负数的区间ID为(x + 1) / (valueDiff + 1) - 1,处理负数时偏移1以保证负数的ID正确return (x + 1) / (valueDiff + 1) - 1;}}// 判断是否存在两个元素,其索引差小于等于indexDiff,值的差小于等于valueDiffbool containsNearbyAlmostDuplicate(vector<int>& nums, int indexDiff, int valueDiff) {int n = nums.size();unordered_map<int, int> map;  // 哈希表用于存储每个区间ID对应的最新元素值// 遍历数组中的每个元素for (int i = 0; i < n; i++) {long x = nums[i];  // 当前元素值long id = getId(x, valueDiff);  // 获取当前元素所属的区间ID// 如果当前元素的索引超出范围,移除之前索引差超过indexDiff的元素if (i - (indexDiff + 1) >= 0) {map.erase(getId(nums[i - (indexDiff + 1)], valueDiff));}// 检查当前区间ID是否已经存在相同的元素,若存在则返回trueif (map.find(id) != map.end()) {return true;}// 检查相邻的区间ID是否存在符合条件的元素// 区间ID为id-1,若存在并且两者差值小于等于valueDiff,则符合条件if (map.find(id - 1) != map.end() && abs(map[id - 1] - x) <= valueDiff) {return true;}// 区间ID为id+1,若存在并且两者差值小于等于valueDiff,则符合条件if (map.find(id + 1) != map.end() && abs(map[id + 1] - x) <= valueDiff) {return true;}// 如果都没有找到符合条件的元素,则将当前元素放入哈希表map[id] = x;}// 如果没有找到符合条件的元素,返回falsereturn false;}
};

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C++语言版
    在这里插入图片描述


http://www.ppmy.cn/ops/142993.html

相关文章

CentOS7源码编译安装nginx+php+mysql

1.安装nginx 安装依赖 yum -y install gcc gcc-c wget automake autoconf libtool libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed pcre-devel openssl openssl-devel 创建一个不能登录的nginx运行用户 groupadd www-data useradd -s /sbin/nologin -g www-d…

vue 插值表达式{{ }}

vue 插值表达式 是什么 Vue.js的插值表达式是一种特殊的语法&#xff0c;用于将数据绑定到模板中。它使用"Mustache"语法&#xff08;双大括号&#xff09;将JavaScript表达式嵌入到HTML模板中。在模板中&#xff0c;使用双大括号将表达式包裹起来&#xff0c;然后Vu…

http 和 https 的区别?

HTTP (HyperText Transfer Protocol) 和 HTTPS (HyperText Transfer Protocol Secure) 是两种用于在 Web 浏览器和网站服务器之间传输网页的协议&#xff0c;它们的主要区别在于安全性。以下是 HTTP 和 HTTPS 的一些关键区别&#xff1a; 安全性&#xff1a; HTTP&#xff1a;H…

将PDF流使用 canvas 绘制然后转为图片展示在页面上(二)

将PDF流转为图片展示在页面上 使用 pdfjs-dist 库来渲染 PDF 页面到 canvas 上&#xff0c;然后将 canvas 转为图片 安装 pdfjs-dist 依赖 npm install pdfjs-dist 或者 yarn add pdfjs-dist创建一个组件来处理 PDF 流的加载和渲染 该组件中是一个包含 PDF 文件的 ArrayBuffer…

C# 开发探索与实践 第一个C#程序

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

C#速成(GID+图形编程)

常用类 类说明Brush填充图形形状,画刷GraphicsGDI绘图画面&#xff0c;无法继承Pen定义绘制的对象直线等&#xff08;颜色&#xff0c;粗细&#xff09;Font定义文本格式&#xff08;字体&#xff0c;字号&#xff09; 常用结构 结构说明Color颜色Point在平面中定义点Rectan…

SpringCloud 集成 Eureka服务,本机测试

Eureka是一款开源的服务注册与发现组件&#xff0c;分EurekaServer和EurekaClient。 Eureka作用过程&#xff1a; Eureka Client&#xff08;服务提供者&#xff09;启动向Eureka Server&#xff08;http-api&#xff09;注册,另一个Eureka Client&#xff08;服务消费者&#…

Node.js 文件系统

Node.js 的文件系统模块&#xff08;fs 模块&#xff09;提供了丰富的 API&#xff0c;用于读取、写入、删除文件以及执行其他文件系统操作。 fs 模块既支持同步方法也支持异步方法&#xff0c;使得开发者可以根据具体需求选择合适的方式来处理文件操作。 导入 fs 模块 首先…