LeetCode简单题:219. 存在重复元素 II(Python,C++,Java)

一.解法

https://leetcode-cn.com/problems/contains-duplicate-ii/
要点:hashset,滑动窗口
和218题类似,但要注意相邻相同数的位置差大小是否大于k。
有两种方法,java和c++用了滑动窗口,保证hashset的大小小于等于k。
Python用了另一种方法,用字典哈希表,hashmap[nums[i]]=i来存放最新一次nums[i]这个元素出现的位置,如果新的i减去hashmap[nums[i]]大于k,就更新hashmap[nums[i]]=i,否则返回true。

二.Python实现

class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        hashset={}
        length=len(nums)
        for i in range(0,length):
            if hashset.get(nums[i])==None:
                hashset[nums[i]]=i
            else:
                if i-hashset[nums[i]]<=k:
                    return True
                hashset[nums[i]]=i
                    
        return False

三.C++实现

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
         unordered_set<int> set; //搜索、插入和移除平均常数时间复杂度,不会超时
    for(int i = 0; i < nums.size(); i++)
    {
        if(set.find(nums[i])!= set.end())
            return true;
        set.insert(nums[i]);
        if(set.size() > k )
            set.erase(nums[i-k]); //滑动窗口长度最大为k 
    }
    return false;


    }
};

四.java实现

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        Set<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;

    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。