【LeetCode219】存在重复元素 II(哈希表)

简介: 哈希。mp[i]=j表示数字i在原数组的下标。一次遍历判断即可。PS:unordered_map的mp.find(value)返回的是value对应的key值。

一、题目


image.png

二、思路和代码

哈希。mp[i]=j表示数字i在原数组的下标。一次遍历判断即可。

PS:unordered_map的mp.find(value)返回的是value对应的key值。


一开始这样提交,发现下面的方法有3个测试用例没过,比如[1, 0, 1, 1] k = 1这种情况,发现正确应该是返回true的,但是这样的方法会只判断了第0个1和第2个1这两个位置(没有判断最后两个1的情况),是因为没有更新哈希表中key对应的value的最新值导致的。

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        //mp[i]=j表示数字i在原数组的下标
        unordered_map<int, int>mp;
        int temp;
        for(int i = 0; i < nums.size(); i++){
            //存在nums[i]为key的kv
            if(mp.count(nums[i])){
                temp = abs(mp[nums[i]] - i);
                if(temp <= k){
                    return true;
                }
            }else{//之前没有遍历过这个数字
                mp[nums[i]] = i;
            }
        }
        return false;
    }
};

所以在判断哈希表存在nums[i]时,最后同样需要进行更新,即在if内加上mp[nums[i]] = i;

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        //mp[i]=j表示数字i在原数组的下标
        unordered_map<int, int>mp;
        int temp;
        for(int i = 0; i < nums.size(); i++){
            //存在nums[i]为key的kv
            if(mp.count(nums[i])){
                temp = abs(mp[nums[i]] - i);
                if(temp <= k){
                    return true;
                }
                mp[nums[i]] = i;  //一开始漏了这句,因为要更新!!
            }else{//之前没有遍历过这个数字
                mp[nums[i]] = i;
            }
        }
        return false;
    }
};

image.png


感谢柳小葱大佬~补充python解法,enumerate获取索引和数值后,用字典dic的key存储数值, value存储索引,一次for遍历四行代码搞定:

class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        dic = {}
        # dic的key为数值, value为索引
        for key, v in enumerate(nums):
            if v in dic and key - dic[v] <= k:
                return True
            dic[v] = key
        return False
相关文章
|
17天前
|
索引
力扣随机一题 6/26 哈希表 数组 思维
力扣随机一题 6/26 哈希表 数组 思维
12 0
|
17天前
力扣随机一题 哈希表 排序 数组
力扣随机一题 哈希表 排序 数组
10 1
|
1月前
|
存储 算法 Python
二刷力扣--哈希表
二刷力扣--哈希表
|
1月前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
13天前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
6 0
|
1月前
|
存储 算法 数据可视化
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
|
1月前
|
算法 数据可视化 数据挖掘
力扣136题全解析:寻找只出现一次的数字(哈希表与异或运算详解,附图解)
力扣136题全解析:寻找只出现一次的数字(哈希表与异或运算详解,附图解)
|
1月前
|
存储 算法 数据可视化
哈希表法快速求解最长连续序列 | 力扣128题详细解析
哈希表法快速求解最长连续序列 | 力扣128题详细解析
|
1月前
|
算法 数据可视化 数据挖掘
哈希表+DFS快速解决力扣129题:求根节点到叶节点数字之和
哈希表+DFS快速解决力扣129题:求根节点到叶节点数字之和
|
1月前
|
算法 搜索推荐 Java
【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)
17 3