148. 颜色分类

148. 颜色分类

中文English

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

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

样例

样例 1

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

挑战

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

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

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

注意事项

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

输入测试数据 (每行一个参数)如何理解测试数据?

 (只遍历一遍,常数级空间复杂度,O(n)时间复杂度)

class Solution:
    """
    @param nums: A list of integer which is 0, 1 or 2 
    @return: nothing
    """
    '''
    大致思路:
    1.循环,如果是0的话,就往前面插入,如果是2的话,就往后面插,最终只要p == len(nums)即可以跳出循环,i来定位当前指向的那个元素,p为定位当前已经循环的次数。
    '''
    def sortColors(self, nums):
        i = 0 
        p = 0
        while True:  
            if p == len(nums):
                break
            if nums[i] == 0:
                nums.insert(0,nums.pop(i))
            
            elif nums[i] == 2:
                nums.append(nums.pop(i))
                i -= 1
            i += 1
            p += 1
        return nums

 

posted @ 2020-05-05 15:49  风不再来  阅读(178)  评论(0编辑  收藏  举报