返回

LeetCode 75:颜色分类,排序出红色、白色、蓝色的旗帜

见解分享

LeetCode第75号问题是一道中等难度的排序算法题,考验了我们对数组操作和算法实现的基本功。它要求我们对一个包含红色(0)、白色(1)和蓝色(2)三个颜色元素的数组进行排序,使得相同颜色的元素相邻,并且按照红、白、蓝的顺序排列。

问题解法

有多种算法可以解决这个问题,但最常见的方法是双指针法。该方法使用两个指针:

  • left: 指向数组中未排序部分的第一个元素。
  • right: 指向数组中已排序部分的最后一个元素。

从左到右遍历数组,同时使用left和right指针跟踪未排序部分和已排序部分。当left指针指向的元素为所需颜色时,将其移动到已排序部分。当right指针指向的元素为所需颜色时,将其移动到未排序部分。否则,移动left指针。

具体步骤如下:

  1. 初始化 left 和 right 指针: left = 0,right = n - 1,其中 n 是数组的长度。
  2. 循环遍历数组: 从 left 到 right。
  3. 如果 arr[left] == 0 (红色): 将 arr[left] 和 arr[right] 交换,然后递增 left 和递减 right。
  4. 如果 arr[left] == 2 (蓝色): 只递减 right。
  5. 如果 arr[left] == 1 (白色): 继续遍历。

重复步骤2-5,直到left和right指针相交,此时数组已完成排序。

复杂度分析

  • 时间复杂度: O(n),其中 n 是数组的长度。该算法需要遍历数组一遍。
  • 空间复杂度: O(1),因为我们不需要额外的空间来存储数据。

代码示例

def sortColors(nums):
  left, right = 0, len(nums) - 1

  while left <= right:
    if nums[left] == 0:
      nums[left], nums[right] = nums[right], nums[left]
      right -= 1
      left += 1
    elif nums[left] == 2:
      right -= 1
    else:
      left += 1

  return nums

扩展

除了双指针法,还有一些其他方法可以解决这个问题,例如:

  • 计数排序: 统计每个颜色的出现次数,然后根据这些计数重建数组。
  • 快排: 使用快速排序算法,以颜色作为分区键。
  • 基数排序: 使用颜色作为基数排序算法中的最低有效位。

总结

LeetCode第75号问题是一个经典的排序算法问题,通过使用双指针法,我们可以高效地对包含红色、白色和蓝色元素的数组进行排序。理解这种方法对于掌握排序算法的基础知识至关重要。