当前位置: 首页 > news >正文

【面试经典150 | 哈希表】存在重复元素 II

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:哈希表
    • 方法二:滑动窗口
  • 其他语言
    • python3+哈希表
    • python3+滑动窗口
  • 写在最后

Tag

【哈希表】【滑动窗口】【数组】


题目来源

219. 存在重复元素 II


题目解读

判断在数组中有没有相同的元素小于一定的距离。


解题思路

方法一:哈希表

我们维护一个哈希表来记录数组中的元素以及上一次出现的位置,如果上一次出现的位置和这一次出现的位置之差小于等于 k,那就返回 true,否则返回 false

实现代码

class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {int n = nums.size();unordered_map<int, int> mp;for (int i = 0; i < n; ++i) {if (mp.count(nums[i]) && (i - mp[nums[i]] <= k)) {return true;}mp[nums[i]] = i;}return false;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 nums 的长度。

空间复杂度: O ( n ) O(n) O(n),使用哈希表记录数组中元素上一次出现的位置。

方法二:滑动窗口

换一个思路,我们只要判断在长度为 k 的窗口中是否有重复的元素出现即可。在滑窗没满之前,就向滑窗中加入元素,加入之前判断滑窗内是否有当前要加入的元素,如果有,直接返回 false;当滑窗满了,滑动滑窗,当前的 nums[i] 要进入滑窗,那么 nums[i - k - i] 要退出滑窗,判断滑窗内是否有当前要加入的元素,如果有,直接返回 false

如果滑窗滑到数组末尾,都没有返回 true,就返回 false

实现代码

class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_set<int> s;int n = nums.size();for (int i = 0; i < n; ++i) {if (i > k) {s.erase(nums[i - k - 1]);}if (s.count(nums[i])) return true;s.emplace(nums[i]);}return false;}
};

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 nums 的长度。

空间复杂度: O ( k ) O(k) O(k),使用无序集合记录滑窗中的元素。


其他语言

python3+哈希表

class Solution:def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:pos = {}for i, num in enumerate(nums):if num in pos and i - pos[num] <= k:return Truepos[num] = ireturn False

python3+滑动窗口

class Solution:def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:s = set()for i, num in enumerate(nums):if i > k:s.remove(nums[i - k - 1])if num in s:return Trues.add(num)return False

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

http://www.lryc.cn/news/191791.html

相关文章:

  • Intellij 安装配置 lombok
  • Chrome插件精选 — 暗色主题插件
  • PXE解决uefi安装centos6黑屏问题
  • Feign 调用为何POST不支持同时传入多个SpringQueryMap对象,但是GET方法就支持?
  • RISC-V 特权级架构
  • 目录启示:PHP 与命名空间的声明
  • D. Divide and Equalize--Codeforces Round 903 (Div. 3)
  • 保姆式教程:MAC安装Android studio(包括安装JDK,Android SDK),解决gradle下载慢的问题
  • Ps:选区的布尔运算
  • PyTorch 深度学习之卷积神经网络(基础篇)Basic CNN(九)
  • torch实现Gated PixelCNN
  • 破局「二次创业」:合思的新解法
  • 第五章:TCP和UDP基本原理
  • 算法:动态规划的入门理解
  • 最新版nacos 2.2.3服务注册与发现版本依赖问题
  • 2023年中国合同能源管理行业研究报告
  • php以半小时为单位,输出指定的时间范围
  • Electron应用的 asar 打包 解压
  • 蓝桥等考Python组别十七级003
  • Redis概述和与SpringBoot的整合
  • Python 中的 round() 函数:实现精确的数值舍入操作
  • 在springboot中如何开启Bean数据校验
  • 【C语言好题系列三】
  • ElasticSearch搜索引擎:常用的存储mapping配置项 与 doc_values详细介绍
  • [Spring]事务的传播机制
  • linux下,如何查看一个文件的哈希值md5以及sha264
  • Java类加载过程
  • 人脸活体检测技术的应用,有效避免人脸识别容易被攻击的缺陷
  • 大数据发展史
  • 有关范数的学习笔记