LeetCode题练习与总结:存在重复元素Ⅱ--219

2024-09-07 13:12

本文主要是介绍LeetCode题练习与总结:存在重复元素Ⅱ--219,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述

给你一个整数数组 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 <= 10^5
  • -10^9 <= nums[i] <= 10^9
  • 0 <= k <= 10^5

二、解题思路

  • 使用一个哈希表(HashMap)来存储遍历过的数字及其对应的索引。
  • 遍历数组 nums,对于每个元素 nums[i]
    • 检查当前元素是否已经在哈希表中,如果存在,则计算当前索引 i 与哈希表中存储的索引之差的绝对值,如果小于等于 k,则返回 true
    • 如果当前元素不在哈希表中,或者不满足上述条件,则将当前元素及其索引存入哈希表。
  • 如果遍历完整个数组都没有找到满足条件的索引对,则返回 false

三、具体代码

import java.util.HashMap;
import java.util.Map;class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {Map<Integer, Integer> map = new HashMap<>(); // 哈希表存储元素及其索引for (int i = 0; i < nums.length; i++) {// 检查当前元素是否在哈希表中,并且索引差小于等于kif (map.containsKey(nums[i]) && i - map.get(nums[i]) <= k) {return true;}// 将当前元素及其索引存入哈希表map.put(nums[i], i);}return false; // 遍历完数组没有找到满足条件的索引对}
}

这段代码中,我们使用了一个HashMap来存储数组中的元素和它们对应的索引。当我们遍历数组时,我们首先检查当前元素是否已经在HashMap中,如果是,则检查索引差是否满足条件。如果满足条件,我们返回true。如果不满足,我们将当前元素和它的索引存入HashMap。如果遍历完整个数组都没有找到满足条件的索引对,我们返回false

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 遍历数组 nums 的时间复杂度是 O(n),其中 n 是数组 nums 的长度。
  • 在每次遍历时,我们会在哈希表 map 中进行两个操作:containsKey 和 put。在理想情况下,哈希表的操作时间复杂度是 O(1),这是因为哈希表通过散列函数将键均匀分布到桶中,从而可以在常数时间内访问、插入和删除元素。

综上所述,整体算法的时间复杂度是 O(n),因为每个元素只被处理一次,且每次处理的时间复杂度是 O(1)。

2. 空间复杂度
  • 哈希表 map 的大小取决于数组 nums 中不同元素的数量。在最坏的情况下,如果数组中的所有元素都是唯一的,那么哈希表的大小将与数组 nums 的长度相同,即 O(n)。
  • 哈希表中的每个条目包含一个整数(数组中的元素)和一个整数(索引),因此每个条目的大小是 O(1)。

因此,整体算法的空间复杂度是 O(n),这是因为在最坏的情况下,我们需要存储数组中的所有元素及其索引。

五、总结知识点

  • 类定义 (class 关键字):

    • 定义了一个名为 Solution 的公共类。
  • 方法定义:

    • 定义了一个名为 containsNearbyDuplicate 的公共实例方法,接受一个整数数组 nums 和一个整数 k 作为参数,并返回一个布尔值。
  • 数据结构 (HashMap):

    • 使用了 HashMap,它是 Java 中的一个哈希表实现,用于存储键值对(在本例中是数组元素及其索引)。
  • 循环 (for 循环):

    • 使用了 for 循环来遍历数组 nums
  • 条件判断 (if 语句):

    • 使用了 if 语句来检查是否在哈希表中找到了与当前元素相等的元素,并且索引差满足小于等于 k 的条件。
  • 哈希表操作:

    • 使用了 HashMap 的 containsKey 方法来检查哈希表中是否包含特定的键。
    • 使用了 HashMap 的 get 方法来获取与特定键关联的值。
    • 使用了 HashMap 的 put 方法来将键值对插入到哈希表中。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

这篇关于LeetCode题练习与总结:存在重复元素Ⅱ--219的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145152

相关文章

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会