返回

剑指 Offer 3:在排序数组中查找重复的数字

后端

导读:

剑指 Offer 3:在排序数组中查找重复的数字。

这道题是算法和数据结构中一个经典的面试题。顾名思义,它的目标是在一个排序数组中找到重复出现的数字。本题旨在考察求职者的编程能力、算法思维以及对数组操作的熟练程度。

解题思路:

这道题的解题思路比较巧妙。首先,由于数组是排序的,我们可以利用二分查找法快速定位重复数字所在的位置。具体步骤如下:

  1. 初始化左右指针left和right,分别指向数组的首尾元素。
  2. 计算中点mid,并比较nums[mid]与nums[mid-1]和nums[mid+1]。
  3. 如果nums[mid]等于nums[mid-1]或nums[mid+1],则说明重复数字找到了,返回nums[mid]。
  4. 如果nums[mid]大于nums[mid-1]和nums[mid+1],则重复数字一定在mid的左侧。更新right指针为mid-1。
  5. 如果nums[mid]小于nums[mid-1]和nums[mid+1],则重复数字一定在mid的右侧。更新left指针为mid+1。
  6. 重复步骤2~5,直到left和right指针相遇,此时left指向的元素就是重复数字。

代码实现:

def find_duplicate(nums):
  """
  在排序数组中查找重复的数字

  Args:
    nums: 排序数组

  Returns:
    重复的数字
  """

  if not nums:
    return -1

  left, right = 0, len(nums) - 1

  while left < right:
    mid = (left + right) // 2

    if nums[mid] == nums[mid - 1] or nums[mid] == nums[mid + 1]:
      return nums[mid]
    elif nums[mid] > nums[mid - 1] and nums[mid] > nums[mid + 1]:
      right = mid - 1
    else:
      left = mid + 1

  return nums[left]

复杂度分析:

  • 时间复杂度:O(logN),其中N是数组的长度。二分查找算法的时间复杂度为O(logN)。
  • 空间复杂度:O(1),该算法不需要额外的空间。

总结:

剑指 Offer 3:在排序数组中查找重复的数字,是一道经典的面试题。掌握其解题思路和代码实现对求职者非常有帮助。本篇文章详细介绍了这道题的解法,希望对大家有所启发。