leetcode 面试经典 150 题:存在重复元素 II

ops/2025/1/15 8:38:44/
链接存在重复元素 II
题序号219
题型数组
解法1. 哈希表、2. 滑动窗口
难度简单
熟练度✅✅✅✅

题目

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

示例 1:

输入:nums = [1,2,3,1], k = 3
输出:true
示例 2:

输入:nums = [1,0,1,1], k = 1
输出:true
示例 3:

输入:nums = [1,2,3,1,2,3], k = 2
输出:false

提示:

1 <= nums.length <= 105
-109 <= nums[i] <= 109
0 <= k <= 105

题解

  1. 核心思想:使用哈希表来存储元素及其索引。遍历数组,对于当前元素如果它已经在哈希表中,并且当前索引与哈希表中存储的索引之差小于等于k,则返回true。如果它不在哈希表中,或者索引之差大于k,则更新哈希表中该元素的索引为当前索引。
  2. 复杂度:时间复杂度和空间复杂度都是O(n)。
  3. c++ 实现算法
bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int, int> numIndexMap; // 哈希表存储数字及其下标for (int i = 0; i < nums.size(); i++) {// 检查当前数字是否在哈希表中,如果不等式为 true,则表示 nums[i] 已经在哈希表中,可能是重复元素//numIndexMap.find(nums[i]):表示查找哈希表 numIndexMap 中是否包含键值为 nums[i] 的元素。//如果找到该元素,返回该元素的迭代器。//如果找不到该元素,返回哈希表的 end() 迭代器。if (numIndexMap.find(nums[i]) != numIndexMap.end()) {// 判断下标差值是否小于等于 k,numIndexMap[nums[i]]是键对应的值,即上次该数字在数组中的下标if (i - numIndexMap[nums[i]] <= k) {return true;}}// 更新当前数字的最新下标numIndexMap[nums[i]] = i;}return false; // 遍历完仍未找到符合条件的元素
}
  1. 算法推演
  • 假设输入为: nums = [1, 2, 3, 1],k = 3

  • 初始化
    定义一个哈希表 numIndexMap,存储数组中每个元素的最近一次出现位置。

  • 遍历数组,从第一个元素开始处理。

    • 第 1 步:元素 1(索引 0)
      当前元素:nums[0] = 1
      哈希表:numIndexMap = {}(空)
      1 不在哈希表中,将其加入哈希表:numIndexMap = {1: 0}

    • 第 2 步:元素 2(索引 1)
      当前元素:nums[1] = 2
      哈希表:numIndexMap = {1: 0}
      2 不在哈希表中,将其加入哈希表:numIndexMap = {1: 0, 2: 1}

    • 第 3 步:元素 3(索引 2)
      当前元素:nums[2] = 3
      哈希表:numIndexMap = {1: 0, 2: 1}
      3 不在哈希表中,将其加入哈希表:numIndexMap = {1: 0, 2: 1, 3: 2}

    • 第 4 步:元素 1(索引 3)
      当前元素:nums[3] = 1
      哈希表:numIndexMap = {1: 0, 2: 1, 3: 2}
      1 已经在哈希表中,上次出现的索引为 numIndexMap[1] = 0。

    • 检查索引差:3 - 0 = 3,满足条件 ≤k。 返回
      true。

  • 输出
    由于在第 4 步找到了满足条件的元素对,算法返回 true。

  1. c++ 完整 demo
#include <iostream>
#include <vector>
#include <unordered_map>using namespace std;bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int, int> numIndexMap; // 哈希表存储数字及其下标for (int i = 0; i < nums.size(); i++) {// 检查当前数字是否在哈希表中,如果不等式为 true,则表示 nums[i] 已经在哈希表中,可能是重复元素//numIndexMap.find(nums[i]):表示查找哈希表 numIndexMap 中是否包含键值为 nums[i] 的元素。//如果找到该元素,返回该元素的迭代器。//如果找不到该元素,返回哈希表的 end() 迭代器。if (numIndexMap.find(nums[i]) != numIndexMap.end()) {// 判断下标差值是否小于等于 k,numIndexMap[nums[i]]是键对应的值,即上次该数字在数组中的下标if (i - numIndexMap[nums[i]] <= k) {return true;}}// 更新当前数字的最新下标numIndexMap[nums[i]] = i;}return false; // 遍历完仍未找到符合条件的元素
}int main() {vector<int> nums = {1, 2, 3, 1};int k = 3;cout << (containsNearbyDuplicate(nums, k) ? "true" : "false") << endl;nums = {1, 0, 1, 1};k = 1;cout << (containsNearbyDuplicate(nums, k) ? "true" : "false") << endl;nums = {1, 2, 3, 1, 2, 3};k = 2;cout << (containsNearbyDuplicate(nums, k) ? "true" : "false") << endl;return 0;
}

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

相关文章

Django自带admin管理系统使用

1、admin路径地址 localhost:8000/admin 2、使用命令行创建超级管理员 python manage.py createsuperuser 之后按照提示一步一步往下走就好了。 3、修改管理员密码 python manage.py changepassword admin admin是超级管理员的账号 4、后台管理系统注册模型&#xff0c;…

redis缓存篇知识点总结

1.缓存雪崩 当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃 发生缓存雪崩有两…

2025年,华为认证HCIA、HCIP、HCIE 该如何选择?

眼看都到 2025 年啦&#xff0c;华为认证还吃香不&#xff1f; 把这问题摆在每个网络工程师跟前&#xff0c;答案可没那么容易说清楚。 到底考不考它值当不值当&#xff0c;重点在于您自己的职业规划&#xff0c;还有对行业走向的领会。 2025 年华为认证仍然值得一考&#…

Kotlin 快速上手指南:从安装 IntelliJ IDEA 到编写第一个程序

文章目录 什么是kotlinIntelliJ IDEA安装 IntelliJ IDEA创建 Kotlin 项目运行 Kotlin 程序更改进入后默认打开上一次项目的设置打开 IntelliJ IDEA进入设置:重新启动 IntelliJ IDEA:快速学习Kotlin变量声明类型推断条件表达式定义函数单表达式函数when 表达式when 语句的基本…

1. npm 常用命令详解

npm 常用命令详解 npm&#xff08;Node Package Manager&#xff09;是 Node.js 的包管理工具&#xff0c;用于安装和管理 Node.js 应用中的依赖库。下面是 npm 的一些常用命令及其详细解释和示例代码。 镜像源 # 查询当前使用的镜像源 npm get registry# 设置为淘宝镜像源 …

进程同步之信号量机制

信号量机制 信号量机制是一种用于进程同步和互斥的基本工具&#xff0c;特别是在并发编程中&#xff0c;广泛用于控制对共享资源的访问&#xff0c;避免数据竞争和死锁等问题。信号量机制由荷兰计算机科学家Edsger Dijkstra在1965年提出&#xff0c;并在操作系统的进程同步中发…

基于微信小程序的社区门诊管理系统php+论文源码调试讲解

第4章 系统设计 4.1系统结构设计 系统设计是把本系统的各项功能需求进行细化&#xff0c;而转换为软件系统表示的一个设计过程&#xff0c;在对目标系统的研究分析之后&#xff0c;做出整个系统平台的总体规划&#xff0c;进而对用例中各个对象进一步地合理精细设计。为降低整…

使用Python和Neo4j驱动程序来实现小规模数据的CSV导入

要将CSV数据导入到Neo4j数据库中&#xff0c;你可以使用Neo4j提供的工具&#xff0c;比如neo4j-admin import命令&#xff08;适用于大规模数据导入&#xff09;&#xff0c;或者使用Python的Neo4j驱动程序通过Cypher查询逐行插入数据&#xff08;适用于小规模数据导入&#xf…