75. 颜色分类(中)

题目

  • 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
    我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
    必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1:

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

示例 2:

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

法一、统计

  • 统计数组几个0,1,2然后重写数组
class Solution:
    def sortColors(self, nums: List[int]) -> None:
        #统计数组几个0,1,2然后重写数组
        # count1,count2,count3=nums.count(0),nums.count(1),nums.count(2)
        # for i in range(0,count1):
        #     nums[i]=0
        # for i in range(count1,len(nums)-count3):
        #     nums[i]=1
        # for i in range(len(nums)-count3,len(nums)):
        #     nums[i]=2
        # return nums

        #升级一下
        count1,count2,count3=nums.count(0),nums.count(1),nums.count(2)
        for i in range(len(nums)):  
            if i < count1:  
                nums[i] = 0  
            elif i >= count1 and i < len(nums) - count3:  
                nums[i] = 1  
            else:  
                nums[i] = 2  
        return nums

法二、冒泡排序

for i in range (len(nums)):
            for j in range(i,len(nums)):
                if nums[i]>nums[j]:
                    nums[i],nums[j]=nums[j],nums[i]
        return nums

法三、三指针

i,c,j=0,0,len(nums)-1#i指向数组头,c表示当前元素,j指向数组尾
        while c<=j:#当数组没结束时进行
            if nums[c]==2:#如果当前元素是2,则与数组尾换,并j往前移一位
                nums[c],nums[j]=nums[j],nums[c]
                j-=1
            if nums[c]==0:#如果当前元素是0,则与数组头换,并i往后移一位,c也往后移一位
                nums[c],nums[i]=nums[i],nums[c]
                i+=1
                c+=1
            if nums[c]==1:#如果当前元素是1,只把c往后移一位
                c+=1
        return nums
posted @ 2024-01-30 14:36  Frommoon  阅读(12)  评论(0编辑  收藏  举报