返回

你在LeetCode打卡了48题了吗?小白必读:存在重复元素 II讲解及代码实现

前端

今天,我们继续LeetCode打卡之旅,来到第48题——存在重复元素 II。这道题属于滑动窗口问题,也是LeetCode入门必刷题之一。接下来,我们就来详细讲解一下这道题的解题思路、代码实现和时间复杂度分析。

算法原理

存在重复元素 II问题要求我们判断一个数组中是否存在两个不同的索引 i 和 j,使得nums[i] == nums[j]且abs(i - j) <= k。

这道题的解题思路很简单,我们可以使用滑动窗口的方法来解决。具体来说,我们可以使用两个指针left和right来表示滑动窗口的左右边界。初始时,left和right都指向数组的第一个元素。然后,我们将right指针向右移动,直到窗口的大小达到k + 1。如果窗口内存在重复元素,那么说明问题答案为true。否则,我们将left指针向右移动一位,并将right指针移动到left指针的后一位。如此反复,直到right指针到达数组的末尾。如果在整个过程中都没有找到重复元素,那么说明问题答案为false。

代码实现

def contains_duplicate(nums, k):
  """
  判断一个数组中是否存在两个不同的索引 i 和 j,使得nums[i] == nums[j]且abs(i - j) <= k。

  Args:
    nums: 一个整数数组。
    k: 一个整数。

  Returns:
    如果存在重复元素,则返回True,否则返回False。
  """

  # 使用哈希表来存储窗口内的元素
  hash_table = {}

  # 初始化滑动窗口的左右边界
  left, right = 0, 0

  # 遍历数组
  while right < len(nums):
    # 将right指针指向的元素添加到哈希表中
    hash_table[nums[right]] = right

    # 如果窗口大小大于k + 1,则将left指针指向的元素从哈希表中删除
    if right - left > k:
      del hash_table[nums[left]]
      left += 1

    # 如果窗口内存在重复元素,则返回True
    if nums[right] in hash_table and hash_table[nums[right]] != right:
      return True

    # 将right指针向右移动一位
    right += 1

  # 如果整个过程中都没有找到重复元素,则返回False
  return False

时间复杂度分析

代码的时间复杂度为O(n),其中n是数组nums的长度。因为我们在每次循环中都会对窗口内的元素进行哈希表查找,而哈希表查找的时间复杂度为O(1)。

小白友好代码优化建议

对于小白来说,理解算法原理和代码实现就已经很不容易了,对代码进行优化可能有点困难。不过,这里还是提供一些小白友好的代码优化建议,帮助你更好地理解和掌握这道题。

  • 使用更简单的哈希表实现 :如果你对哈希表不是很熟悉,可以使用更简单的哈希表实现,比如字典(dict)。
  • 减少哈希表查找次数 :你可以通过将窗口内的元素存储在一个列表中,然后使用列表的index()方法来查找元素,这样可以减少哈希表查找的次数。
  • 使用更简洁的代码 :你可以使用一些Python内置函数来使代码更简洁,比如max()和min()函数。

希望这些建议对你有所帮助。如果你有其他问题,也可以随时留言提问。