【LeetCode】75. 颜色分类

题目

解法

遇到问题

小结

题目

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意:
不能使用代码库中的排序函数来解决这道题。

示例:

输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]

进阶:

一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
你能想出一个仅使用常数空间的一趟扫描算法吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-colors

解法

解法1:这题因为就三个数,我的想法也比较简单,声明一个长度相同,全为1的一维数组one。两个变量,m=0,n=len(nums)-1.

一趟扫描,遇0则one[m]=0,m++;遇2则one[n]=2,n--.最后的One即为最后的答案。

class Solution(object):
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        len_s = len(nums)
        one = [1] * len_s
        m = 0
        n = len_s - 1
        for i in range(len_s):
            if nums[i] == 0:
                one[m] = 0
                m += 1
            elif nums[i] == 2:
                one[n] = 2
                n -= 1
        for i in range(len_s):
            nums[i] = one[i]

解法2:利用快速排序的思想,开三个变量,zero=0,two=len(nums),i=0.

在nums上进行扫描,i为循环的变量。此题三种情况,比较简单直接附代码。

class Solution(object):
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        def swap(nums, index1, index2):
            nums[index1], nums[index2] = nums[index2], nums[index1]

        size = len(nums)
        if size < 2:
            return

        zero = 0
        two = size

        i = 0

        while i < two:
            if nums[i] == 0:
                swap(nums, i, zero)
                i += 1
                zero += 1
            elif nums[i] == 1:
                i += 1
            else:
                two -= 1
                swap(nums, i, two)

遇到问题

小结

posted @ 2020-05-28 15:51  记录人生  阅读(93)  评论(0)    收藏  举报