返回

用不同的方法解决 LeetCode 75. 颜色分类

闲谈

LeetCode 75. 颜色分类

认识颜色分类问题

颜色分类问题是 LeetCode 中一个经典的算法问题,它要求您将一个包含红色、白色和蓝色元素的数组重新排列,使得红色元素出现在最前面,白色元素在中间,蓝色元素在最后。

解决方法 1:双指针法

双指针法是一种高效且易于理解的方法,它使用两个指针 leftright 来遍历数组,并将红色元素移动到数组的开头,蓝色元素移动到数组的末尾。

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. 颜色分类问题的不同方法:双指针法、计数排序法和快速排序法。每种方法都有其优缺点,您可以根据具体情况选择最合适的方法。

希望这篇技术指南对您有所帮助,如果您有任何问题或建议,请随时与我联系。