代码训练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
,判断数组中是否存在两个 不同的索引i
和j
,满足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
中是否存在两个不同的索引 i
和 j
,使得 nums[i] == nums[j]
且两个索引的差的绝对值不大于 k
。如果存在这样的一对索引,则返回 true
,否则返回 false
。
要解决这个问题,可以采用哈希表记录法:
- 创建一个哈希表来存储数组值和其对应的最新索引。
- 遍历数组,对于每个元素,检查哈希表中是否已经存在该元素:
- 如果存在,则比较当前索引与哈希表中存储的索引的差的绝对值是否不大于
k
。 - 如果满足条件,则直接返回
true
。 - 如果不满足条件,或者元素不存在于哈希表中,则更新哈希表,将该元素的索引设置为当前索引。
- 如果存在,则比较当前索引与哈希表中存储的索引的差的绝对值是否不大于
- 如果遍历完数组后没有找到符合条件的元素对,则返回
false
。
分析步骤:
- 初始化一个空的哈希表
map
。 - 遍历数组
nums
,对于每个元素nums[i]
:- 检查
nums[i]
是否已存在于map
中。 - 如果存在,计算当前索引
i
和map[nums[i]]
的差的绝对值。 - 如果这个差值小于等于
k
,返回true
。 - 否则,更新
map[nums[i]]
为当前索引i
。
- 检查
- 遍历结束后,如果没有找到符合条件的索引对,返回
false
。
举例分析,以 nums = [1,2,3,1], k = 3
为例:
- 初始化
map = {}
。 - 遍历
nums
:i = 0
,nums[i] = 1
,map
更新为{1: 0}
。i = 1
,nums[i] = 2
,map
更新为{1: 0, 2: 1}
。i = 2
,nums[i] = 3
,map
更新为{1: 0, 2: 1, 3: 2}
。i = 3
,nums[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
的主要步骤如下:
- 重置哈希表。
- 遍历数组
nums
,对于每个元素:- 计算哈希索引
nums[i] & 0x1fff
,即将元素的低 13 位作为哈希索引。 - 在对应的哈希桶中查找是否存在相同的元素,且下标之差的绝对值小于等于
k
,如果找到则返回true
。 - 如果没有找到,则创建一个新的节点,存储当前元素的值和下标,插入到哈希桶的链表中。
- 计算哈希索引
- 如果遍历完整个数组都没有找到符合条件的元素对,则返回
false
。
运行结果如下所示(仅供参考):
这段代码写得很暴力,优化空间很大:
- 哈希表的大小
HashSize
可以根据实际情况进行调整,选择一个合适的大小以平衡内存使用和哈希冲突的概率。 - 可以考虑使用更高效的哈希函数,例如使用素数取模或者其他哈希算法,以减少哈希冲突的概率。
- 在插入新节点时,可以先判断链表的长度是否超过了一定的阈值,如果超过了,可以考虑将链表转换为其他数据结构,如红黑树,以提高查找效率。
- 可以考虑在插入新节点时,如果链表长度超过了
k
,则可以直接删除链表头部的节点,因为它们的下标之差肯定大于k
,不会影响结果。
4. 总结
本题主要考查对数组遍历和哈希表的应用能力。通过使用哈希表存储元素的最新索引,我们能够有效检查是否有符合条件的索引对。这种方法利用了哈希表快速查找和插入的特性,使得时间复杂度控制在 O(n) 内,适合处理大规模数据。
相关文章:

代码训练LeetCode(17)存在重复元素
代码训练(17)LeetCode之存在重复元素 Author: Once Day Date: 2024年5月7日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 219. 存在重复元素 II - 力扣(LeetCode)力扣 (LeetCode) 全球…...
运营模型—归因分析(Attribution Analysis)
运营模型—归因分析(Attribution Analysis) 随着互联网技术和业务的发展,广告投放相关的业务也随之兴起。那么广告投放的效果评估也就随之而来。广告的投放一般都是收费模式,所以选中的渠道商的好坏直接和自己的利益挂钩。于是,「归因分析」便最早应用在了广告投放行业。(…...

我必须要吹一波MATLAB 2024a,太牛逼了!|福利:附安装教程及下载地址
最近逛MATLAB官网,发现MATLAB 2024a版本已经Pre-release了,翻了下release note,不得不感叹,实在是太强了! 这次重点更新了四个工具箱: Computer Vision Toolbox Deep Learning Toolbox Instrument Contro…...
XMLHttpRequest与Axios详解
XMLHttpRequest发送请求 在JavaScript中,使用XMLHttpRequest()发送多个参数通常涉及到设置HTTP请求的Content-Type头部,并且将参数作为请求体的一部分发送。以下是一个示例,展示了如何发送包含多个参数的POST请求: var xhr new X…...

【区块链】智能合约简介
智能合约起源 智能合约这个术语至少可以追溯到1995年,是由多产的跨领域法律学者尼克萨博(NickSzabo)提出来的。他在发表在自己的网站的几篇文章中提到了智能合约的理念。他的定义如下:“一个智能合约是一套以数字形式定义的承诺&a…...
上海市计算机学会竞赛平台2024年1月月赛丙组成绩等第
题目描述 给定一个在 00 到 100100 之间的整数 𝑎a,请将它转成等第,规则如下: 9090 或以上为 A8080 或以上为 B7070 或以上为 C6060 或以上为 D5959 或以下为 F 输入格式 单个数字表示 𝑎a 输出格式 单个字符表示…...
【算法入门教育赛2】C.曼哈顿种类 C++题解与代码
比赛地址:https://www.starrycoding.com/contest/6 题目描述 牢 e e e知道在武汉有 n n n家自助店,第 i i i个自助店用坐标 ( x i , y i ) (x_i, y_i) (xi,yi)表示,因为武汉的街道都是互相垂直的,现在他想知道所有自助店之间…...
Electron使用 SQLite
在客户端开发中,无论是 PC 端,还是手机端,为了能够访问离线数据,数据经常需要保存到本地,IndexDB 可以用于存储本地数据,IndexDB 是一个对象存储,数据是以 key:value 的形式进行存储和访问的&am…...

怎样的跨网软件,可以实现网间数据的安全收发?
网络隔离已是较为常见的网络安全保护措施,比如防火墙、网闸、VLAN,云桌面虚拟环境等方面进行隔离。像一些科技研发型企业,不仅仅是内外网隔离,甚至还划分办公网、研发网、测试网、生产网等,防止研发资料、设计资料等敏…...

Sora惊艳亮相:AI技术掀起创作革命,影视产业迎来新风貌!
Sora平台近期发布了名为"Sora首次印象"的更新,为用户带来了令人瞩目的变化。该更新不仅展示了Sora平台的发展方向,还介绍了其在电影制作、广告宣传等领域的潜在应用。 同时,Sora的首席执行官Sam Altman与好莱坞影视工作室进行了会…...

Mac电脑安装打开APP显示问题已损坏 问题解决
当MAC电脑安装完软件打开时,显示文件已损坏,无法打开。搜了很多教程终于找到解决方案,记录下方便以后再用。 我的mac电脑是intel芯片的,如果你遇到这个问题,可以参考我的这个方案。 1.首先当打开软件后出现 “xx软件已…...

AI 数据观 | TapData Cloud + MongoDB Atlas:大模型与 RAG 技术有机结合,落地实时工单处理智能化解决方案
本篇为「AI 数据观」系列文章第二弹,在这里,我们将进一步探讨 AI 行业的数据价值。以 RAG 的智能工单应用场景为例,共同探索如何使用 Tapdata Cloud MongoDB Atlas 实现具备实时更新能力的向量数据库,为企业工单处理的智能化和自…...

Vulnhub靶机随笔-Hacksudo_Aliens
Vulnhub靶机Hacksudo_Aliens详解 攻击机Kali IP:192.168.3.44 靶机 IP:未知 系统:未知 A.信息收集 扫描靶机存活性 确定IP地址 1.命令:arp-scan -l 扫描靶机开放端口及其服务版本信息 2.命令 nmap -A -p- -sV 靶机IP地址 靶机开放三个端口,22ssh端口,80web端…...

抖店选品都怎么选品?什么样的产品更吸引人,更具有购买力?
大家好,我是电商花花。 抖店选品一直都是我们无货源商家的核心问题,不管是出单、还是爆单,店铺想要有销量的前提下都是选品。 很多人一上来就是就是选品,没有选品经验还瞎选品,结果到最后选了一堆出单的产品…...

将来会是Python、Java、Golang三足鼎立吗?
在开始前我有一些资料,是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 软件工程里没有银弹ÿ…...

Java入门基础学习笔记16——运算符
package cn.ensource.operator;public class OperatorDemo1 {public static void main(String[] args) {// 目标:掌握基本的算术运算符的使用int a 10;int b 2;System.out.println(a b);System.out.println(a - b);System.out.println(a * b); // 20System.out.…...
golang中三种线程安全的MAP
一、map 是什么 map 是 Go 中用于存储 key-value 关系数据的数据结构,类似 C 中的 map,Python 中的 dict。Go 中 map 的使用很简单,但是对于初学者,经常会犯两个错误:没有初始化,并发读写。 1、未初始化的…...

C++笔试强训day16
目录 1.字符串替换 2.神奇数 3.DNA序列 1.字符串替换 链接 简单的遍历替换即可: class Solution { public:string formatString(string str, vector<char>& arg) {string ret;int k 0;for (int i 0; i < str.size(); i){if (str[i] %){ret arg…...

spsr 的恢复出错,导致 thumb 指令集的 it 条件运行指令运行异常,清晰的调试思路帮助快速解决问题
记一次调试过程 这是一个在 arm 架构上的 RTOS 上的调试过程。问题现象为使用 thumb 指令集的 libgcc 库的情况下,浮点运算随机出错。经过一番追踪调试,逐步缩小问题范围,最后定位问题,成功解决。 场景 在某款的国产 RTOS 上&a…...
mysql binlog 如何区分db
binlog不是InnoDB存储引擎特有的日志文件,是属于mysql server自己的日志文件。 提交事务的时候,同时会写入binlog 在MySQL中,Binary Log(binlog)记录了数据库更改操作的所有细节,对于实现数据复制、恢复以…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...