0%

LeetCode.颜色分类

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

  • 进阶:你可以不使用代码库中的排序函数来解决这道题吗?你能想出一个仅使用常数空间的一趟扫描算法吗?
  1. 示例 1:输入:nums = [2,0,2,1,1,0], 输出:[0,0,1,1,2,2]
  2. 示例 2:输入:nums = [2,0,1], 输出:[0,1,2]
  3. 示例 3:输入:nums = [0], 输出:[0]
  4. 示例 4:输入:nums = [1], 输出:[1]  

    解法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    object SortColors {

    def main(args: Array[String]): Unit = {
    val arr = Array(0, 2, 2, 2, 0, 2, 1, 1)
    sortColors(arr)
    println(java.util.Arrays.toString(arr))

    val arr1 = Array(2, 1, 2, 0, 1, 1, 1, 1, 1)
    sortColors(arr1)
    println(java.util.Arrays.toString(arr1))

    val arr2 = Array(2)
    sortColors(arr2)
    println(java.util.Arrays.toString(arr2))

    val arr3 = Array(0, 0)
    sortColors(arr3)
    println(java.util.Arrays.toString(arr3))

    val arr4 = Array(2, 0, 1)
    sortColors(arr4)
    println(java.util.Arrays.toString(arr4))

    val arr5 = Array(2, 0, 2, 1, 1, 0)
    sortColors(arr5)
    println(java.util.Arrays.toString(arr5))
    }

    /**
    * 双指针,时间复杂度O(n)
    */
    def sortColors(nums: Array[Int]): Unit = {
    if (nums.length <= 1) return
    var i = 0
    var s = 0
    var e = nums.length - 1

    while (s < nums.length && nums(s) == 0) {
    s += 1
    }

    i = s
    while (i <= e) {
    nums(i) match {
    case 0 =>
    swap(nums, i, s)
    while (s <= e && nums(s) == 0) {
    s += 1
    }
    i = s
    case 1 =>
    swap(nums, i, s)
    i += 1
    case 2 =>
    swap(nums, i, e)
    while (e >= s && nums(e) == 2) {
    e -= 1
    }
    }
    }
    }

    def swap(nums: Array[Int], i: Int, j: Int): Unit = {
    val t = nums(i)
    nums(i) = nums(j)
    nums(j) = t
    }
    }