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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、