148. 颜色分类(三个指针)

148. 颜色分类

中文English

给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。

我们可以使用整数 0,1 和 2 分别代表红,白,蓝。

样例

样例 1

输入 : [1, 0, 1, 2]
输出 : [0, 1, 1, 2]
解释 : 原地排序。

挑战

一个相当直接的解决方案是使用计数排序扫描2遍的算法。

首先,迭代数组计算 0,1,2 出现的次数,然后依次用 0,1,2 出现的次数去覆盖数组。

你否能想出一个仅使用常数级额外空间复杂度且只扫描遍历一遍数组的算法?

注意事项

不能使用代码库中的排序函数来解决这个问题。
排序需要在原数组中进行。

 
 
输入测试数据 (每行一个参数)如何理解测试数据?
class Solution:
    """
    @param nums: A list of integer which is 0, 1 or 2 
    @return: nothing
    """
    def sortColors(self, nums):
        # write your code here
        #三指针,遇到0放左边,遇到2放右边
        length = len(nums)
        #left记录左边0的个数,right记录右边2的个数
        left, right = 0, length - 1
        i = 0

        #当i和right两者想等,即说明已经交换完了
        while i <= right:
            if nums[i] == 0:
                nums[left], nums[i] = nums[i], nums[left]
                left += 1 
                i += 1
            elif nums[i] == 1:
                i += 1
                continue
            elif nums[i] == 2:
                nums[right], nums[i] = nums[i], nums[right]
                right -= 1
        
        return nums
原文地址:https://www.cnblogs.com/yunxintryyoubest/p/13196156.html