📌  相关文章
📜  | |第 31 题(1)

📅  最后修改于: 2023-12-03 14:48:43.785000             🧑  作者: Mango

| | 第 31 题

题目描述

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

示例
输入: nums = [1,2,3,1], k = 3
输出: true
输入: nums = [1,0,1,1], k = 1
输出: true
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
思路

维护一个大小为k的哈希表,记录已经遍历过的数字。当遍历到一个新的数字时,检查哈希表中是否已经存在该数字,如果存在,则判断两个索引的差是否不大于k,如果是,则返回true,否则将当前数字添加到哈希表中。这样做的时间复杂度为O(n),空间复杂度为O(k)。

代码实现
class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        hashmap = {} # 哈希表
        for i in range(len(nums)):
            if nums[i] in hashmap and i - hashmap[nums[i]] <= k:
                return True
            hashmap[nums[i]] = i
        return False
class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(nums[i]) && i - map.get(nums[i]) <= k) {
                return true;
            }
            map.put(nums[i], i);
        }
        return false;
    }
}
class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        unordered_map<int, int> hashmap;// 哈希表
        for (int i = 0; i < nums.size(); i++) {
            if (hashmap.count(nums[i]) && i - hashmap[nums[i]] <= k) {
                return true;
            }
            hashmap[nums[i]] = i;
        }
        return false;
    }
};
测试结果

经LeetCode运行测试,以上三种语言的代码均通过,无超时、无错误。