Leetcode 每日一题 219.存在重复元素 II

目录

问题描述

输入输出格式

示例

算法分析

过题图片

代码实现

复杂度分析

题目链接

总结


问题描述

给定一个整数数组nums和一个整数k,我们需要判断数组中是否存在两个不同的索引ij,使得nums[i] == nums[j]|i - j| <= k。如果存在这样的ij,返回true;否则,返回false

输入输出格式

  • 输入:一个整数数组nums和一个整数k
  • 输出:一个布尔值,表示是否存在满足条件的ij

示例

  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

算法分析

这个问题可以通过使用哈希表来解决。我们需要跟踪最近k个元素,检查是否有任何重复的元素出现。以下是解决这个问题的步骤:

  1. 创建一个HashSet来存储最近k个元素。
  2. 遍历数组nums,对于每个元素:
    • 检查该元素是否已经在HashSet中。如果是,返回true
    • 将当前元素添加到HashSet中。
    • 如果HashSet的大小超过了k,从HashSet中移除最老的元素(即在i - k位置的元素)。
  3. 如果遍历结束后没有找到重复元素,返回false

过题图片

代码实现

 

java

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        HashSet<Integer> set = new HashSet<>();
        for(int i = 0; i < nums.length; i++) {
            if(set.contains(nums[i])) {
                return true;
            }
            set.add(nums[i]);
            if(set.size() > k) {
                set.remove(nums[i - k]);
            }
        }
        return false;
    }
}

C++

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

复杂度分析

  • 时间复杂度:O(n),其中n是数组nums的长度。我们只需要遍历一次数组。
  • 空间复杂度:O(min(n, k)),在最坏的情况下,我们需要存储所有元素,但在大多数情况下,我们只需要存储最近k个元素。

题目链接

219. 存在重复元素 II - 力扣(LeetCode)

总结

这个问题是一个典型的使用哈希表解决的问题,它考察了我们对哈希表操作的理解和应用。通过维护一个滑动窗口内的元素集合,我们可以有效地检查是否存在满足条件的重复元素。这种方法简洁且高效,是解决这类问题的首选方法。此外可以通过这道题看一下其他应用

哈希表的应用

哈希表(或称为散列表)是一种通过键值对存储数据的数据结构,它能够提供快速的查找、插入和删除操作。在这个问题中,哈希表的使用展示了其在处理数组和集合问题中的强大能力。通过将元素的值作为键,我们可以在常数时间内检查元素是否已经存在于哈希表中,从而避免了复杂的遍历和比较操作。

滑动窗口技术

滑动窗口是一种处理数组子区间问题的有效技术。在这个问题中,我们维护了一个大小为k的窗口,随着数组的遍历,窗口内的元素集合也在不断更新。这种技术允许我们只关注数组中与当前元素距离不超过k的元素,从而简化了问题。

时间和空间效率

我们的方法具有线性时间复杂度O(n),其中n是数组的长度。这是因为我们只需要遍历一次数组,并且在哈希表中进行的操作(插入、删除和查找)都是常数时间的。空间复杂度为O(min(n, k)),这是因为在最坏的情况下,我们可能需要存储所有元素,但在大多数情况下,我们只需要存储最近k个元素。

代码实现的简洁性

我们的代码实现简单而直观,易于理解和实现。这种方法不仅减少了代码的复杂性,也降低了出错的可能性。通过将逻辑封装在一个循环中,我们避免了复杂的条件判断和多个循环的嵌套。

算法的适用性

这种方法不仅适用于本问题,还可以推广到其他需要检测数组中重复元素的场景,特别是那些涉及到元素之间距离限制的问题。例如,它可以用于检测一个数组中是否存在两个元素,它们的差值不超过某个给定的阈值。

算法的局限性

尽管这种方法在大多数情况下都非常有效,但它也有局限性。例如,如果数组中的元素数量远远大于k,那么维护一个固定大小的窗口可能不是最优的选择。此外,如果数组中的元素值范围非常大,哈希表可能会消耗大量的内存。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ragflow连不上ollama的解决方案

由于前期wsl默认装在C盘&#xff0c;后期部署好RagFlow后C盘爆红&#xff0c;在连接ollama的时候一直在转圈圈&#xff0c;问其他人没有遇到这种情况&#xff0c;猜测是因为内存不足无法加载模型导致&#xff0c;今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…

PR的选择与移动

选择工具 可以选择序列上的剪辑&#xff0c;如果需要多选可以按住shift键选中多个剪辑 CtrlA&#xff1a;可以进行全选 编组 选中多个剪辑后“右键-编组“可以将所选的剪辑连接在一起。这时单击任意剪辑都可以选中全部 向前选择轨道工具与向后选择轨道工具 向前选择轨道工具…

使用C#基于ADO.NET编写MySQL的程序

MySQL 是一个领先的开源数据库管理系统。它是一个多用户、多线程的数据库管理系统。MySQL 在网络上特别流行。MySQL 数据库可在大多数重要的操作系统平台上使用。它可在 BSD Unix、Linux、Windows 或 Mac OS 上运行。MySQL 有两个版本&#xff1a;MySQL 服务器系统和 MySQL 嵌入…

Python3中赋值运算符说明二

一. 简介 前面文章简单学习了 Python3中一些赋值运算符&#xff0c;文章如下&#xff1a; Python3中赋值运算符上篇-CSDN博客 本文继续学习 Python3中另外一些赋值运算符。 二. Python3 中赋值运算符 1. Python3 中赋值运算符 前一篇文章简单学习了 Python3 中的一些赋值…

如何在 Ubuntu 22.04 上安装和使用 Apache Kafka

简介 Apache Kafka是一个高性能、低延迟的分布式流处理平台&#xff0c;广泛用于构建实时数据管道和流式应用。本文将指导你如何在Ubuntu 22.04系统上快速部署Apache Kafka&#xff0c;让你体验到Kafka在处理大规模实时数据流方面的强大能力。通过本教程&#xff0c;你将学会如…

群控系统服务端开发模式-应用开发-自动退出发送邮件

一、修改Redis配置文件 将redis.conf里面的notify-keyspace-events参数对应的值改为Ex&#xff0c;具体代码如下&#xff1a; notify-keyspace-events Ex 二、创建控制台命令 在根目录下config文件夹下找到console.php文件修改&#xff0c;具体代码如下&#xff1a; <?p…

前端篇 -- jQuery详细教程

jQuery教程 jQuery官网1.1 jQuery的基本介绍1.2 jQuery 基本开发步骤1.3 jQuery对象和DOM对象 1.3.1 jQuery对象的基本介绍1.3.2 DOM对象转 jQuery对象1.3.3 jQuery对象转DOM对象 1.4 jQuery选择器 1.4.1 jQuery 基本选择器介绍1.4.2 基本选择器1.4.3 层次选择器1.4.4 基础过滤…

【数模学习笔记】模糊综合评价

声明&#xff1a;以下笔记中的图片均来自“数学建模学习交流”清风老师的课程ppt&#xff0c;仅用作学习交流使用 模糊综合评价 文章目录 模糊综合评价模糊数学经典集合和模糊集合的基本概念经典集合和特征函数模糊集合和隶属函数模糊集合的分类 隶属函数的确定方法方法一 模糊…

STM32F103单片机使用STM32CubeMX新建IAR工程步骤

打开STM32CubeMX软件&#xff0c;选择File 选择新建工程 在打开的窗口输入单片机型号 在右下角选择单片机型号&#xff0c;然后点右上角 start project&#xff0c;开始新建工程。 接下来设置调试接口&#xff0c;在左边System Core中选择 SYS&#xff0c;然后在右右边debu…

相机(Camera)硬件组成详解

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 写在前面&#xff1a;可以去B站观看一些相机原理的视频来配合学习&#xff0c;这里推荐&#xff1a;推荐1&#xff0c;推荐2&#xff0c;推荐3 相机&#xff08;Camera&#xff09;是一种复杂的光…

String【Redis对象篇】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a; 文章目录 String1.String是什么&#xff1f;2.String怎么用&#xff1f;3.常用操作4.底层实现&#xff1f;5.总结&#xff08;重点&#xff09; String 1.String是什么&#xff1f; String就是字符串&…

乘上 SpringBoot 东风,广场舞团掀起律动热潮

2 系统开发环境 2.1 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群&#xff0c;所以Java的发展迅速。…

组件开发的环境准备

目录​​​​​​​ node.js的安装 npm镜像源的修改 pnpm包管理器的安装&#xff08;全局安装&#xff09; 基于pnpm创建脚手架项目 node.js的安装 Node.js 是一个开源的、跨平台的 JavaScript 运行环境&#xff0c;能够在服务器端执行 JavaScript 代码。 a.下载与安装 …

【OpenCV】Canny边缘检测

理论 Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年提出。 这是一个多阶段算法&#xff0c;我们将介绍算法的每一个步骤。 降噪 由于边缘检测易受图像中的噪声影响&#xff0c;因此第一步是使用 5x5 高斯滤波器去除图像中的噪声。我们在前面的章…

gitee常见命令

目录 1.本地分支重命名 2.更新远程仓库分支 3.为当前分支设置远程跟踪分支 4.撤销已经push远程的代码 5.idea->gitee的‘还原提交’ 需要和本地当前的代码解决冲突 解决冲突 本地工作区的差异代码显示 本地commit和push远程 6.idea->gitee的‘将当前分支重置到此…

Ultra-Fast-Lane-Detection复现、部署及训练

Ultra-Fast-Lane-Detection复现、训练及部署 一、复现二、训练三、部署 一、复现 Github下载源码&#xff1a;https://github.com/cfzd/Ultra-Fast-Lane-Detection &#xff08;1&#xff09;将GPU运算改为CPU运算&#xff1a;.cuda() -> .to(‘cpu’) test.py中33行&…

【Java计算机毕业设计】基于SSM+VUE宠物领养管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…

Linux-ubuntu环境配置

一&#xff0c;安装VWware&#xff0c;里面导入镜像文件 这些都是文件夹里面有的&#xff0c;然后对着正点原子视频安装就行&#xff0c;虚拟机的破解码&#xff0c;去百度搜一个能用就行&#xff0c;中间遇见俩问题。①乌班图里面不能上网&#xff0c;②插入U盘后&#xff0c;…

Python Selenium 各浏览器驱动下载与配置使用(详细流程)

大家好啊&#xff01;我是NiJiMingCheng 这是我的博客&#xff1a;NiJiMingCheng 这节课我们来学习安装selenium和对应的各个浏览器驱动&#xff0c;个人比较喜欢使用谷歌浏览器驱动&#xff0c;所以接下来以谷歌浏览器来为大家做示例&#xff01;&#xff01;&#xff01; Sel…