Swift - LeetCode - 存在重复元素 II

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情 

题目

给你一个整数数组 nums 和一个整数 k,判断数组中是否存在两个 不同的索引 i 和 j,满足 nums[i] == nums[j]abs(i - j) <= k。如果存在,返回 true;否则,返回 false

示例 1:

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

示例 2:

  • 输入:nums = [1,0,1,1], k = 1
  • 输出:true

示例 3:

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

方法一:哈希表

思路及解法

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

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

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

假设存在下标 j j′ 满足 j < j < i j' < j < i n u m s [ j ] = n u m s [ j ] = n u m s [ i ] nums[j′]=nums[j]=nums[i] ,则 i j > i j > i j i - j' > i - j>i−j ,由于 i j > k i - j>k ,因此必有 i j > k i - j' > k

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

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

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

  2. n u m s [ i ] nums[i] 和下标 i i 存入哈希表,此时 i i n u m s [ i ] nums[i] 的最大下标。

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

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

代码

class Solution {
    func containsNearbyDuplicate(_ nums: [Int], _ k: Int) -> Bool {
        var map: [Int:Int] = [:]
        for i in 0..<nums.count {
            let num = nums[i]
            if nil != map[num] && (i - (map[num] ?? 0)) <= k {
                return true
            }
            map[num] = i
        }
        return false
    }
}
复制代码

复杂度分析

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

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

猜你喜欢

转载自juejin.im/post/7130648316659892231