返回
用不同的方法解决 LeetCode 75. 颜色分类
闲谈
2024-02-15 01:07:07
LeetCode 75. 颜色分类
认识颜色分类问题
颜色分类问题是 LeetCode 中一个经典的算法问题,它要求您将一个包含红色、白色和蓝色元素的数组重新排列,使得红色元素出现在最前面,白色元素在中间,蓝色元素在最后。
解决方法 1:双指针法
双指针法是一种高效且易于理解的方法,它使用两个指针 left
和 right
来遍历数组,并将红色元素移动到数组的开头,蓝色元素移动到数组的末尾。
def sort_colors_two_pointers(nums):
"""
:type nums: List[int]
:rtype: None
"""
left, right = 0, len(nums) - 1
while left < right:
# 如果当前元素为蓝色,将其与右侧的元素交换
if nums[left] == 2:
nums[left], nums[right] = nums[right], nums[left]
right -= 1
# 如果当前元素为红色,将其与左侧的元素交换
elif nums[left] == 0:
nums[left], nums[right] = nums[right], nums[left]
left += 1
# 如果当前元素为白色,则直接跳过
else:
left += 1
return nums
解决方法 2:计数排序法
计数排序法是一种基于元素计数的排序算法,它通过计算每个元素出现的次数,然后根据这些计数值来确定每个元素在新数组中的位置。
def sort_colors_counting_sort(nums):
"""
:type nums: List[int]
:rtype: None
"""
# 计算每个元素出现的次数
counts = [0, 0, 0]
for num in nums:
counts[num] += 1
# 将元素重新排列到新数组中
index = 0
for i in range(3):
for j in range(counts[i]):
nums[index] = i
index += 1
return nums
解决方法 3:快速排序法
快速排序法是一种高效的排序算法,它通过将数组划分为较小的子数组,然后递归地对这些子数组进行排序来工作。
def sort_colors_quick_sort(nums):
"""
:type nums: List[int]
:rtype: None
"""
def partition(nums, left, right):
# 选择一个基准元素
pivot = nums[right]
# 将数组划分为两个部分,左边部分的元素都小于基准元素,右边部分的元素都大于等于基准元素
i = left - 1
for j in range(left, right):
if nums[j] < pivot:
i += 1
nums[i], nums[j] = nums[j], nums[i]
# 将基准元素放在正确的位置
nums[i + 1], nums[right] = nums[right], nums[i + 1]
# 返回基准元素的位置
return i + 1
def quick_sort(nums, left, right):
# 如果 left >= right,则数组已经有序,直接返回
if left >= right:
return
# 将数组划分为两个部分
pivot_index = partition(nums, left, right)
# 对两个部分进行递归排序
quick_sort(nums, left, pivot_index - 1)
quick_sort(nums, pivot_index + 1, right)
quick_sort(nums, 0, len(nums) - 1)
return nums
结论
在这篇文章中,我们介绍了三种解决 LeetCode 75. 颜色分类问题的不同方法:双指针法、计数排序法和快速排序法。每种方法都有其优缺点,您可以根据具体情况选择最合适的方法。
希望这篇技术指南对您有所帮助,如果您有任何问题或建议,请随时与我联系。