返回
LeetCode 75:颜色分类,排序出红色、白色、蓝色的旗帜
见解分享
2024-01-06 17:25:53
LeetCode第75号问题是一道中等难度的排序算法题,考验了我们对数组操作和算法实现的基本功。它要求我们对一个包含红色(0)、白色(1)和蓝色(2)三个颜色元素的数组进行排序,使得相同颜色的元素相邻,并且按照红、白、蓝的顺序排列。
问题解法
有多种算法可以解决这个问题,但最常见的方法是双指针法。该方法使用两个指针:
- left: 指向数组中未排序部分的第一个元素。
- right: 指向数组中已排序部分的最后一个元素。
从左到右遍历数组,同时使用left和right指针跟踪未排序部分和已排序部分。当left指针指向的元素为所需颜色时,将其移动到已排序部分。当right指针指向的元素为所需颜色时,将其移动到未排序部分。否则,移动left指针。
具体步骤如下:
- 初始化 left 和 right 指针: left = 0,right = n - 1,其中 n 是数组的长度。
- 循环遍历数组: 从 left 到 right。
- 如果 arr[left] == 0 (红色): 将 arr[left] 和 arr[right] 交换,然后递增 left 和递减 right。
- 如果 arr[left] == 2 (蓝色): 只递减 right。
- 如果 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号问题是一个经典的排序算法问题,通过使用双指针法,我们可以高效地对包含红色、白色和蓝色元素的数组进行排序。理解这种方法对于掌握排序算法的基础知识至关重要。