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

news2024/12/18 15:47:30

文章目录

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

一【题目类别】

  • 数组

二【题目难度】

  • 困难

三【题目编号】

  • 220.存在重复元素 III

四【题目描述】

  • 给你一个整数数组 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所在的区间ID
    private 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,值的差小于等于valueDiff
    public 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是否已经存在相同的元素,若存在则返回true
            if (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);
        }
        // 如果没有找到符合条件的元素,返回false
        return false;
    }
}
  1. Python语言版
class Solution:
    # 根据给定的valueDiff计算当前值x所在的区间ID
    def 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,值的差小于等于valueDiff
    def 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是否已经存在相同的元素,若存在则返回True
            if 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
        # 如果没有找到符合条件的元素,返回False
        return False
  1. C++语言版
class Solution {
public:
    // 根据给定的valueDiff计算当前值x所在的区间ID
    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,值的差小于等于valueDiff
    bool 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是否已经存在相同的元素,若存在则返回true
            if (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;
        }
        
        // 如果没有找到符合条件的元素,返回false
        return false;
    }
};

十【提交结果】

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

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

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

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

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

相关文章

SQL server学习07-查询数据表中的数据(下)

目录 一&#xff0c;自连接查询 二&#xff0c;多表查询 三&#xff0c;关系代数运算 1&#xff0c;笛卡尔乘积运算 1&#xff09;交叉连接 2&#xff0c;连接运算 2&#xff09;内连接 四&#xff0c;外连接 1&#xff0c;左外连接 2&#xff0c;右外连接 3&…

Three.js资源-模型下载网站

在使用 Three.js 进行 3D 开发时&#xff0c;拥有丰富的模型资源库可以大大提升开发效率和作品质量。以下是一些推荐的 Three.js 模型下载网站&#xff0c;它们提供了各种类型的 3D 模型&#xff0c;适合不同项目需求。无论你是需要逼真的建筑模型&#xff0c;还是简单的几何体…

景联文科技入选中国信通院发布的“人工智能数据标注产业图谱”

近日&#xff0c;由中国信息通信研究院、中国人工智能产业发展联盟牵头&#xff0c;联合中国电信集团、沈阳市数据局、保定高新区等70多家单位编制完成并发布《人工智能数据标注产业图谱》。景联文科技作为人工智能产业关键环节的代表企业&#xff0c;入选图谱中技术服务板块。…

WebView2与Chrome内核的区别和使用场景详细介绍

背景 近期有不少朋友使用了HTML一键打包EXE工具中的Webview2(免费)内核,询问的比较多的就是Webview2和Chrome内核的区别, 这里会给大家做一个简单的介绍. WebView2 是由微软提供的一种控件&#xff0c;它允许开发人员在本机应用程序中嵌入 web 技术&#xff08;如 HTML、CSS …

STM32F407ZGT6-UCOSIII笔记3:任务挂起与恢复实验

本文学习与程序编写基于 正点原子的 STM32F1 UCOS开发手册 编写熟悉一下UCOSIII系统的任务挂起与恢复实验 文章提供测试代码讲解、完整工程下载、测试效果图 目录 任务挂起与恢复目的&#xff1a; 任务挂起的目的 任务恢复的目的 任务函数文件&#xff1a; 任务块头文件 #in…

vue使用pdfh5.js插件,显示pdf文件白屏

pdfh5&#xff0c;展示文件白屏&#xff0c;无报错 实现效果图解决方法(降版本)排查问题过程发现问题查找问题根源1、代码写错了&#xff1f;2、预览文件流的问题&#xff1f;3、pdfh5插件更新了&#xff0c;我的依赖包没更新&#xff1f;4、真相大白 彩蛋 实现效果图 解决方法…

脚本搭建论坛

先创建这个目录&#xff1a; 在这个目录中写多个.sh脚本&#xff1a; 将论坛的压缩包放到/var/www/html目录下&#xff1a; 执行main.sh脚本。 Windows网页网址栏输入192.168.234.112/upload/ &#xff08;服务器ip地址&#xff09;&#xff0c;就可以安装了。

摩方M600_更换散热

研究了半天。参考了很多贴吧&#xff0c;哔哩哔哩的网友的方案。最后采用如下&#xff1a; 使用 apx90x47 散热器。散热静音效果很好。温度基本不到80度。作为对比 猫头鹰l9i 会到90温度墙。毕竟两个散热功率不一样。前置在 130w&#xff0c;后者65w。不过开始不懂&#xff0c…

【昇腾】NPU ID:物理ID、逻辑ID、芯片映射关系

起因&#xff1a; https://www.hiascend.com/document/detail/zh/Atlas%20200I%20A2/23.0.0/re/npu/npusmi_013.html npu-smi info -l查询所有NPU设备&#xff1a; [naienotebook-npu-bd130045-55bbffd786-lr6t8 DCNN]$ npu-smi info -lTotal Count : 1NPU…

python03-保留字、标识符;变量、常量;数据类型、数据类型之间的转化

一、保留字 VS 标识符 1-1、35个保留字 保留字&#xff0c;严格区分大小写&#xff01; 查询保留字&#xff1a; 1-2、标识符 常量&#xff1a;python中没有明确的定义常量的关键字&#xff0c;常量的值在程序运行过程中不允许修改&#xff01; 二、变量 VS 常量 2-1、变量 变…

解决VSCode无法识别相对路径的问题

前言&#xff1a; 近日在学习python文件操作时&#xff0c;发现使用VSCode作为编辑器时&#xff0c;文件的相对路径会出问题&#xff0c;报错“指定路径下找不到文件”&#xff0c;无法找到想要的文件。 知识点①&#xff1a;不同操作系统所使用的路径斜杠不同&#xff1a;Lin…

c++理解(三)

本文主要探讨c相关知识。 模板是对类型参数化 函数模板特化不是模板函数重载 allocator(空间配置器):内存开辟释放,对象构造析构 优先调用对象成员方法实现的运算符重载函数,其次全局作用域找 迭代器遍历访问元素,调用erase&#xff0c;insert方法后&#xff0c;当前位置到容器…

「九」HarmonyOS 5 端云一体化实战项目——「M.U.」应用云侧开发云数据库

1 立意背景 M. 代表 “我”&#xff0c;U. 代表 “你”&#xff0c;这是一款用于记录情侣从相识、相知、相恋、见家长、订婚直至结婚等各个阶段美好记忆留存的应用程序。它旨在为情侣们提供一个专属的空间&#xff0c;让他们能够将一路走来的点点滴滴&#xff0c;如初次相遇时…

NVM:安装配置使用(详细教程)

文章目录 一、简介二、安装 nvm三、配置 nvm 镜像四、配置环境变量五、使用教程5.1 常用命令5.2 具体案例 六、结语 一、简介 在实际的开发和学习中可能会遇到不同项目的 node 版本不同&#xff0c;而出现的兼容性问题。 而 nvm 就可以很好的解决这个问题&#xff0c;它可以在…

Spark优化----Spark 数据倾斜

目录 数据倾斜的表现&#xff1a; 定位数据倾斜问题&#xff1a; 解决方案一&#xff1a;聚合原数据 避免 shuffle 过程 缩小 key 粒度&#xff08;增大数据倾斜可能性&#xff0c;降低每个 task 的数据量&#xff09; 增大 key 粒度&#xff08;减小数据倾斜可能性&#xff0c…

第十六届蓝桥杯模拟赛(第一期)-Python

本次模拟赛我认为涉及到的知识点&#xff1a; 分解质因数 Python的datetime库 位运算 简单dp 1、填空题 【问题描述】 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结…

MATLAB2021B APP seriallist 串口通信

文章目录 前言一、项目需要二、使用步骤1.查找串口填写到查找列表2.发送函数3. 接收函数4.检测串口按钮5.选择串口号 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 项目需要&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

OpenShift 4 - 多云管理(2) - 配置多集群观察功能

《OpenShift / RHEL / DevSecOps 汇总目录》 本文在 OpenShift 4.17 RHACM 2.12 环境中进行验证。 文章目录 多集群观察技术架构安装多集群观察功能监控多集群的运行状态监控多集群的应用运行在被管集群监控应用运行在管理集群监控被管集群的应用运行 参考 多集群观察技术架构…

AMBA-CHI协议详解(十二)

AMBA-CHI协议详解&#xff08;一&#xff09;- Introduction AMBA-CHI协议详解&#xff08;二&#xff09;- Channel fields / Read transactions AMBA-CHI协议详解&#xff08;三&#xff09;- Write transactions AMBA-CHI协议详解&#xff08;四&#xff09;- Other transac…

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)

一、RAGFlow简介 RAGFlow是一个基于对文档深入理解的开源RAG&#xff08;Retrieval-augmented Generation&#xff0c;检索增强生成&#xff09;引擎。 主要作用&#xff1a; 让用户创建自有知识库&#xff0c;根据设定的参数对知识库中的文件进行切块处理&#xff0c;用户向大…