题目内容
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]
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 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