[LeetCode] 219、存在重复元素 II

天涯浪子 提交于 2020-02-09 18:14:31

题目描述

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 ij,使得 nums [i] = nums [j],并且 ij 的差的绝对值最大为 k

输入: nums = [1,2,3,1], k = 3
输出: true

解题思路

用哈希表即可,简单题。

  • 更简单的实现方式请见题解
    • 维护一个哈希表,里面始终最多包含 k 个元素,当出现重复值时则说明在 k 距离内存在重复元素。
    • 每次遍历一个元素则将其加入哈希表中,如果哈希表的大小大于 k,则移除最先进入哈希表的数字。

参考代码

我的实现

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        int length = nums.size();
        if(length <= 1)
            return false;
        
        unordered_map<int, unordered_set<int>> umap;
        for(int i = 0; i < length; i++){
            if(umap.count(nums[i]) > 0){
                unordered_set<int> uset = umap[nums[i]];
                for(auto elem: uset){
                    if(abs(i - elem) <= k)
                        return true;
                }
            }
            
            umap[nums[i]].insert(i);
        }
        
        return false;
    }
    
};

更简单的实现:

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;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!