代码训练LeetCode(17)存在重复元素

代码训练(17)LeetCode之存在重复元素

Author: Once Day Date: 2024年5月7日

漫漫长路,才刚刚开始…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 219. 存在重复元素 II - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台

文章目录

      • 代码训练(17)LeetCode之存在重复元素
        • 1. 原题
        • 2. 分析
        • 3. 代码实现
        • 4. 总结

1. 原题

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 ij ,满足 nums[i] == nums[j]abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false

  • 1 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9
  • 0 <= k <= 10^5

例如对于nums = [1,2,3,1,2,3], k = 2,不存在间隔两个以内的相等值,因此返回False。

2. 分析

该题目要求我们判断一个给定的整数数组 nums 中是否存在两个不同的索引 ij,使得 nums[i] == nums[j] 且两个索引的差的绝对值不大于 k。如果存在这样的一对索引,则返回 true,否则返回 false

要解决这个问题,可以采用哈希表记录法

  • 创建一个哈希表来存储数组值和其对应的最新索引。
  • 遍历数组,对于每个元素,检查哈希表中是否已经存在该元素:
    • 如果存在,则比较当前索引与哈希表中存储的索引的差的绝对值是否不大于 k
    • 如果满足条件,则直接返回 true
    • 如果不满足条件,或者元素不存在于哈希表中,则更新哈希表,将该元素的索引设置为当前索引。
  • 如果遍历完数组后没有找到符合条件的元素对,则返回 false

分析步骤

  1. 初始化一个空的哈希表 map
  2. 遍历数组 nums,对于每个元素 nums[i]
    • 检查 nums[i] 是否已存在于 map 中。
    • 如果存在,计算当前索引 imap[nums[i]] 的差的绝对值。
    • 如果这个差值小于等于 k,返回 true
    • 否则,更新 map[nums[i]] 为当前索引 i
  3. 遍历结束后,如果没有找到符合条件的索引对,返回 false

举例分析,以 nums = [1,2,3,1], k = 3 为例:

  • 初始化 map = {}
  • 遍历 nums
    • i = 0nums[i] = 1map 更新为 {1: 0}
    • i = 1nums[i] = 2map 更新为 {1: 0, 2: 1}
    • i = 2nums[i] = 3map 更新为 {1: 0, 2: 1, 3: 2}
    • i = 3nums[i] = 1,发现 1 已存在,且 abs(3 - 0) = 3,满足条件,返回 true

性能优化关键点

  • 哈希表的使用:通过使用哈希表来快速查找和更新元素索引,复杂度为 O(1)。
  • 一次遍历:只需要遍历一次数组,时间复杂度为 O(n),其中 n 是数组的长度。
3. 代码实现
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>bool containsNearbyDuplicate(int* nums, int numsSize, int k) {int* map = (int*)calloc(200001, sizeof(int));for (int i = 0; i < numsSize; i++) {int num = nums[i] + 100000;  // Offset to handle negative indicesif (map[num] != 0 && i - (map[num] - 1) <= k) {free(map);return true;}map[num] = i + 1;  // Store index + 1 to distinguish from initial zero}free(map);return false;
}int main() {int nums[] = {1, 2, 3, 1};int k = 3;int numsSize = sizeof(nums) / sizeof(nums[0]);bool result = containsNearbyDuplicate(nums, numsSize, k);printf("Result: %s\n", result ? "true" : "false");return 0;
}

这段代码实现了一个函数 containsNearbyDuplicate,用于检查给定的整数数组 nums 中是否存在两个相同的元素,它们的下标之差的绝对值小于等于 k

代码使用了哈希表的思想来优化查找效率。哈希表的大小为 HashSize,定义为 0x1fff + 1,即 8192。哈希表使用链表法解决哈希冲突,每个哈希桶都是一个链表的头节点。

函数 hash_reset 用于重置哈希表,释放所有节点的内存。

函数 containsNearbyDuplicate 的主要步骤如下:

  1. 重置哈希表。
  2. 遍历数组 nums,对于每个元素:
    • 计算哈希索引 nums[i] & 0x1fff,即将元素的低 13 位作为哈希索引。
    • 在对应的哈希桶中查找是否存在相同的元素,且下标之差的绝对值小于等于 k,如果找到则返回 true
    • 如果没有找到,则创建一个新的节点,存储当前元素的值和下标,插入到哈希桶的链表中。
  3. 如果遍历完整个数组都没有找到符合条件的元素对,则返回 false

运行结果如下所示(仅供参考):

在这里插入图片描述

这段代码写得很暴力,优化空间很大:

  1. 哈希表的大小 HashSize 可以根据实际情况进行调整,选择一个合适的大小以平衡内存使用和哈希冲突的概率。
  2. 可以考虑使用更高效的哈希函数,例如使用素数取模或者其他哈希算法,以减少哈希冲突的概率。
  3. 在插入新节点时,可以先判断链表的长度是否超过了一定的阈值,如果超过了,可以考虑将链表转换为其他数据结构,如红黑树,以提高查找效率。
  4. 可以考虑在插入新节点时,如果链表长度超过了 k,则可以直接删除链表头部的节点,因为它们的下标之差肯定大于 k,不会影响结果。
4. 总结

本题主要考查对数组遍历和哈希表的应用能力。通过使用哈希表存储元素的最新索引,我们能够有效检查是否有符合条件的索引对。这种方法利用了哈希表快速查找和插入的特性,使得时间复杂度控制在 O(n) 内,适合处理大规模数据。

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

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

相关文章

【ElasticSearch】IK分词器中停用词问题

问题描述 在ES中进行部分关键词搜索时&#xff0c;搜索无结果&#xff0c;如搜索 【IT】 环境描述 中文分词插件 这里使用的是 analysis-ik 分词调试 POST test_index/_analyze {"text":"IT Manager","analyzer": "ik_max_word"…

Spring Security基础教程:从入门到实战

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c…

S型曲线的几种设计(图像对比度调节)

一般来讲&#xff0c;图像调色模块都会提供“曲线”工具&#xff0c;这是一个极其灵活的功能&#xff0c;绝大部分的调色都可以通过该工具实现&#xff0c;但是曲线功能的交互相对而言比较复杂。出于简便性和效率方面的考量&#xff0c;调色模块往往还会提供一些具有很强的功能…

初识C语言——第十四天

指针 总结&#xff1a;指针变量是用来干啥的呢&#xff0c;一是用来存放别人的地址的&#xff0c;指针是有类型的&#xff0c;这个类型是如何写的&#xff1b;二是当我有一天通过*(解引用符&#xff09;找到我所要找的对象&#xff0c;来操作所指向的对象。 #define _CRT_SECUR…

Three.js的几何形状

在创建物体的时候&#xff0c;需要传入两个参数&#xff0c;一个是几何形状【Geometry】&#xff0c;一个是材质【Material】 几何形状主要是存储一个物体的顶点信息&#xff0c;在Three中可以通过指定一些特征来创建几何形状&#xff0c;比如使用半径来创建一个球体。 立方体…

VS2022快捷键修改

VS2022快捷键修改 VS2022快捷键修改 VS2022快捷键修改

芸众商城电商专业版400+插件源码+搭建教程

介绍&#xff1a; 芸众商城社交电商系统SAAS平台前端基于vue开发&#xff0c;后端基于研发积分商城系统源码 php&#xff0c;本文安装芸众商城全插件&#xff08;400多个&#xff09;商业版平台源码&#xff0c;可同时支持多端口部署运行&#xff1b;使用宝塔面板一键部署的形…

2022 年全国职业院校技能大赛高职组云计算赛项试卷(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

docker部署常用工具

1.创建mysql docker run -p 3306:3306 --name mysql -v /home/mysql/conf:/etc/mysql/mysql.conf.d -v /home/mysql/log:/var/log/ -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD2022qwer -d mysql:5.7 而后再执行升级&#xff1a; docker update --restar…

React中的高阶组件的封装,高阶函数,HOC的含义及用法:

含义及作用: 高阶函数代码案例: 调用高阶组价:

CP AUTOSAR之CANXL Driver详细说明(正在更新中)

本文遵循autosar标准&#xff1a;R22-11 1 简介及功能概述 本规范描述了AUTOSAR 基础软件模块CAN XL 驱动程序的功能、API和配置。   本文档的基础是[1,CiA610-1]和[2,CiA611-1]。假设读者熟悉这些规范。本文档不会再次描述CAN XL 功能。   CAN XL 驱动程序是最低层的一部…

算法提高之玉米田

算法提高之玉米田 核心思想&#xff1a;状态压缩dp 将图存入g数组 存的时候01交换一下方便后面判断即g数组中0为可以放的地方 state中1为放的地方 这样只要state为1 g为0就可以判断不合法 #include <iostream>#include <cstring>#include <algorithm>#includ…

Read timed out. (python 安装第三方库超时)

不少人在安装python第三方库的时候经常发生下面情况 解决方法就是往上找 我这里就是 jupyterlab-4.1.8-py3-none-any.whl安装时间过长&#xff0c;失败 那就去国内镜像网站下载下来离线安装 https://pypi.tuna.tsinghua.edu.cn/simple/xxx&#xff08;xxx就是你的包名&#…

Linux内核之获取文件系统超级块:sget用法实例(六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【Linux 命令操作】如何在 Linux 中使用多行注释呢?

文章目录 1. 给代码进行多行注释2. 给代码取消多行注释 1. 给代码进行多行注释 &#x1f427;① 首先用 vim 打开代码&#xff0c;按 Esc进入命令模式(Normal mode)&#xff1b; &#x1f427;② 然后按住 ctrl v 进入列模式&#xff1b; &#x1f427;③ 再通过按 h(左)、j(…

PHP 匿名函数和闭包在数据结构中的应用

匿名函数和闭包在数据结构处理中的应用php 中的匿名函数和闭包可用于处理数组、链表和队列等数据结构。针对数组&#xff0c;匿名函数可用于过滤元素&#xff1b;针对链表&#xff0c;闭包可用于创建节点&#xff1b;针对队列&#xff0c;匿名函数和闭包可实现 fifo 队列操作。…

数仓分层——ODS、DW、ADS

一、什么是数仓分层 数据仓库分层是一种组织和管理数据仓库的结构化方法&#xff0c;它将数据仓库划分为不同的层次或级别&#xff0c;每个层次具有特定的功能和目的。这种分层方法有助于管理数据仓库中的数据流程、数据处理和数据访问&#xff0c;并提供一种清晰的结构来支持…

NVIDIA_SMI has failed because it couldn’t communicate with the NVIDIA driver

参考&#xff1a;https://www.zhihu.com/question/474222642/answer/3127013936 https://blog.csdn.net/ZhouDevin/article/details/128265656 nvidia-smi查看报错&#xff0c;nvcc正常 1&#xff09;查看nvidia版本 ls /usr/src | grep nvidia nvidia-550.78 2&#xff09;…

【大模型】LLaMA-1 模型介绍

文章目录 一、背景介绍二、模型介绍2.1 模型结构2.2 模型超参数2.3 SwiGLU 三、代码分析3.1 模型结构代码3.2 FairScale库介绍 四、LLaMA家族模型4.1 Alpaca4.2 Vicuna4.3 Koala(考拉)4.4 Baize (白泽)4.5 Luotuo (骆驼&#xff0c;Chinese)4.6 其他 参考资料 LLaMA&#xff08…

自动化运维管理工具----------Ansible模块详细解读

目录 一、自动化运维工具有哪些&#xff1f; 1.1Chef 1.2puppet 1.3Saltstack 二、Ansible介绍 2.1Ansible简介 2.2Ansible特点 2.3Ansible工作原理及流程 2.3.1内部流程 2.3.2外部流程 三、Ansible部署 3.1环境准备 3.2管理端安装 ansible 3.3Ansible相关文件 …