[LeetCode] 75. Sort Colors

题目内容

Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.

Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

Note: You are not suppose to use the library's sort function for this problem.

Example:

Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]

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

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

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


题目思路

这道题有两种思路。第一种是因为是0 1 2 对这3个数字排序。那么可以采用归并的方法。也就是遇到0放到左侧,遇到2放到末尾即可。这里可以考虑使用左右双指针以及普通指针,根据普通指针指向的内容进行判定,然后和左右指针的位置进行交换。第二种的思路在于先统计出0,1,2的个数,然后原地覆盖即可。因为题目要求不能使用sort库函数,但是没说不能使用count


程序代码

方法1:

class Solution(object):
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        i,j,k=0,0,len(nums)
        while j!=k:
            if nums[j]==0:
                nums[i],nums[j]=nums[j],nums[i]
                i+=1
                j+=1
            elif nums[j]==2:
                nums[k-1],nums[j]=nums[j],nums[k-1]
                k-=1
            else:
                j+=1
                

方法2:

class Solution(object):
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        if not nums:
            return False
        cnt0,cnt1,cnt2=nums.count(0),nums.count(1),nums.count(2)
        for i in range(len(nums)):
            if 0<=i<cnt0:
                nums[i]=0
            elif cnt0<=i<cnt0+cnt1:
                nums[i]=1
            else:
                nums[i]=2
            
        

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值