首页 > 其他分享 >存在重复元素 II-哈希表

存在重复元素 II-哈希表

时间:2024-07-25 17:28:46浏览次数:18  
标签:遍历 下标 nums 重复 元素 II int 哈希

题目描述:

个人题解:

从左到右遍历数组 nums,当遍历到下标 i 时,如果存在下标 j<i 使得 nums[i]=nums[j],则当 i−j≤k 时即找到了两个符合要求的下标 j 和 i。

如果在下标 i 之前存在多个元素都和 nums[i] 相等,为了判断是否存在满足 nums[i]=nums[j] 且 i−j≤k 的下标 j,应该在这些元素中寻找下标最大的元素,将最大下标记为 j,判断 i−j≤k 是否成立。

如果 i−j≤k,则找到了两个符合要求的下标 j 和 i;如果 i−j>k,则在下标 i 之前不存在任何元素满足与 nums[i] 相等且下标差的绝对值不超过 k。

因此,当遍历到下标 i 时,如果在下标 i 之前存在与 nums[i] 相等的元素,应该在这些元素中寻找最大的下标 j,判断 i−j≤k 是否成立。

可以使用哈希表记录每个元素的最大下标。从左到右遍历数组 nums,当遍历到下标 i 时,进行如下操作:

        1.如果哈希表中已经存在和 nums[i] 相等的元素且该元素在哈希表中记录的下标 j 满足 i−j≤k,返回 true;

        2.将 nums[i] 和下标 i 存入哈希表,此时 i 是 nums[i] 的最大下标。

上述两步操作的顺序不能改变,因为当遍历到下标 i 时,只能在下标 i 之前的元素中寻找与当前元素相等的元素及该元素的最大下标。

当遍历结束时,如果没有遇到两个相等元素的下标差的绝对值不超过 k,返回 false。

代码实现:

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

复杂度分析:

时间复杂度:O(n),其中 n 是数组 nums 的长度。需要遍历数组一次,对于每个元素,哈希表的操作时间都是 O(1)。

空间复杂度:O(n),其中 n 是数组 nums 的长度。需要使用哈希表记录每个元素的最大下标,哈希表中的元素个数不会超过 n。

标签:遍历,下标,nums,重复,元素,II,int,哈希
From: https://blog.csdn.net/qq_45031559/article/details/140656265

相关文章

  • 代码随想录 day8|| 151 翻转单词 28 字符串匹配 459 重复子串
    151翻转单词funcreverseWords(sstring)string{ //思考:判断单词条件是从0或者空格开始到终或者空格结尾,最简单方式strings.split之后变成切片,然后反转就行了 //考虑双指针,左指针指向单词首位,右指针指向单词末尾 varres[]byte varleft,rightint forright<len......
  • 在Python中字典是如何通过哈希表实现的以及哈希冲突是如何解决的
    哈希表(散列表)的工作原理哈希表是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过哈希函数将输入的键(key)映射到表中的一个位置(即索引或槽位),从而以接近常数时间复杂度进行查找、插入和删除操作。哈希表的基本工作流程如下:哈希函数:哈希函数接受一个输入(键),并......
  • 代码随想录算法训练营第 23 天 |LeetCode 39. 组合总和 LeetCode 40.组合总和II LeetC
    代码随想录算法训练营Day23代码随想录算法训练营第23天|LeetCode39.组合总和LeetCode40.组合总和IILeetCode131.分割回文串目录代码随想录算法训练营前言LeetCode39.组合总和LeetCode40.组合总和IILeetCode131.分割回文串一、基础1、回溯可以看成N叉树2、去......
  • 代码随想录算法训练营第 22 天 |LeetCode77. 组合 LeetCode 216.组合总和III LeetCode
    代码随想录算法训练营Day22代码随想录算法训练营第22天|LeetCode77.组合LeetCode216.组合总和IIILeetCode17.电话号码的字母组合目录代码随想录算法训练营前言LeetCode77.组合LeetCode216.组合总和IIILeetCode17.电话号码的字母组合一、基础1、回溯可以解......
  • C++深拷贝构造函数解决浅拷贝的堆区内存重复释放问题
    1.简单介绍先简单介绍一下浅拷贝和深拷贝:浅拷贝->简单的赋值拷贝操作,默认的拷贝构造函数就是浅拷贝。深拷贝->在堆区重新申请空间,进行拷贝操作。2.问题展示下面用代码示例明了地展示默认拷贝构造函数浅拷贝带来地堆区内存重复释放问题:#include<iostream>usingnamespace......
  • LeetCode122. 买卖股票的最佳时机 II
    题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/题目叙述:给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后......
  • binascii.Error:无效的 base64 编码字符串:数据字符数 (41) 不能多于 1 4 的倍数
    我正在尝试使用py-vapid、pywebpush和django-push-notifications通过Webpush发送通知。当我尝试从django管理网站发送测试通知时,我在控制台中收到此回溯日志:|InternalServerError:/djangoadmin/push_notifications/webpushdevice/......
  • 如何在Python中从两个不同长度的列表创建DataFrame,为第二个列表中的每个值重复第一个
    我是一个超级初学者,所以请耐心等待。我觉得这应该很容易,但我无法弄清楚。我不确定是否应该创建两个列表,然后将它们组合起来,或者是否有办法以这种方式直接创建DataFrame。我需要一列包含这些值:df=pd.DataFrame({'x1':np.linspace(-2.47,2.69,num=101)})然后我将值A......
  • 刷题了:344.反转字符串|541. 反转字符串II|卡码网:54.替换数字
    344.反转字符串题目链接:https://leetcode.cn/problems/reverse-string/description/文章讲解:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html视频讲解:https://www.bilibili.com/video/BV1fV4y17748/?spm_id_from=333.788&vd_sou......
  • [Tkey] Transport Nekomusume II
    CL-20考虑定义一条有向边\(u\rightarrowv\)的意义为\(u\)把窝让给了\(v\),那么每个点一定入度为\(1\),所有的边会形成一个外向基环树森林。贪心地把猫娘按照权值从大到小排序,每个猫娘看成一条无向边,那么可行的方案一定会形成一个基环树森林。用并查集维护所有窝组成的基环......