美文网首页算法学习
算法题--三颜色排序

算法题--三颜色排序

作者: 岁月如歌2020 | 来源:发表于2020-04-20 01:30 被阅读0次
image.png

0. 链接

题目链接

1. 题目

Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.

Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

Note: You are not suppose to use the library's sort function for this problem.

Example:

Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]

Follow up:

A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.
Could you come up with a one-pass algorithm using only constant space?

2. 思路1:记录三个颜色的位置下标+从左到右遍历

  • 初始值设置red, white, blue = 0, 0, len(nums) - 1
  • 过程如下图所示


    image.png

即跟着white的视角来观察过程

  • nums[white] == 2时, 需要做一个交换, nums[white], nums[blue] = nums[blue], nums[white], 作用是把当前white所看到的2,转移到数组的BLUE区域的最右边,交换后 blue -= 1, redwhite均不变, 因为此时并不清楚换到左边的是什么值, 下一步仍然要检查这个换来的值
  • nums[white] == 1时, 不需要做修改, 只需要white += 1右移一位, 检查下一个位置, 但此时red并没有变, 也就是说, 这一刻white开始离red而向右而去了, 此时的red可以理解为: 当前RED区域后的第一个位置, 其实是当前WHITE区域的最左位置, 这个位置有什么用呢?它是为了后面可能出现的0准备的
  • nums[white] == 0时, 注意此时white可能跟red不相同, 那么这个新发现的0, 需要追加到左边RED区域的末尾, 即需要做一个交换, nums[white], nums[red] = nums[red], nums[white], 然后red += 1, white += 1, 表示RED区域扩展了一位, 同时待检查元素也挪到了white之后一位
  • white == blue时, 说明WHITE区域BLUE区域会师了,white之后的BLUE区域, 都是2了,不用继续检查了,这样就得到了有序的颜色数组

3. 代码

# coding:utf8
from typing import List


class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        red, white, blue = 0, 0, len(nums) - 1
        while white <= blue:
            if nums[white] == 0:
                nums[red], nums[white] = nums[white], nums[red]
                red += 1
                white += 1
            elif nums[white] == 1:
                white += 1
            else:
                nums[white], nums[blue] = nums[blue], nums[white]
                blue -= 1


def my_test(solution, nums):
    print('input:{}'.format(nums))
    solution.sortColors(nums)
    print('output:{}'.format(nums))
    print('=' * 50)


solution = Solution()
my_test(solution, [2, 0, 2, 1, 1, 0])
my_test(solution, [0, 0, 1, 2, 1, 2])


输出结果

input:[2, 0, 2, 1, 1, 0]
output:[0, 0, 1, 1, 2, 2]
==================================================
input:[0, 0, 1, 2, 1, 2]
output:[0, 0, 1, 1, 2, 2]
==================================================

4. 结果

image.png

相关文章

  • 算法题--三颜色排序

    0. 链接 题目链接 1. 题目 Given an array with n objects colored re...

  • 算法:排序和搜索

    75 颜色分类快速排序:基于重复元素过多的问题,有双路排序和三路排序算法。双路排序即最常用的写法:参考:https...

  • 面试常见算法题你会多少?

    罗列一下常见算法题 看看你会多少?后续会更新上解析 排序算法有哪些?最快的排序算法是哪个?手写一个冒泡排序手写快速...

  • 经典排序算法

    序 虽然在各种编程语言中都提供了快速排序的函数或方法,而且刷算法题时很少需要自己手写排序算法。排序算法都不是很难理...

  • 数据结构&算法(一)

    一、Java实现快速排序算法 二、Java实现折半插入排序算法 三、Java实现冒泡排序算法

  • 排序算法

    前言: 排序算法是面试经常考的题,游戏开发对算法是非常看重的,不说你了解所有算法,但是基本的排序算法是必须掌握的基...

  • 数据结构与算法之线性排序

    线性排序的三大排序算法:桶排序、计数排序、基数排序 这三个算法都不是基于比较的排序算法,所以能做到线性的时间复杂度...

  • 脚塌实地之常见算法

    长期更新,记录自己看到的算法题 常见排序法 冒泡排序(O(n2)) 调用 算法解析:从小到大排序,通过相邻两个数进...

  • 冒泡、选择、插入排序

    三个时间复杂度为 O(n^2)的排序算法 排序有很多种,有些算法连名字都没听过,经过这段时间的刷题,我在这里总结一...

  • LeetCode | 算法:颜色排序

    75. Sort Colors Given an array with n objects colored red...

网友评论

    本文标题:算法题--三颜色排序

    本文链接:https://www.haomeiwen.com/subject/syeobhtx.html