题目:给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
进阶:
你可以不使用代码库中的排序函数来解决这道题吗?
你能想出一个仅使用常数空间的一趟扫描算法吗?
链接 https://leetcode.cn/problems/sort-colors
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
a = 0
b = 0
c = 0
for i in nums:
if i == 0:
a += 1
elif i == 1:
b += 1
else:
c += 1
nums[:] = [0]*a+[1]*b+[2]*c
当然代码里的说的是原地修改数组,nums[:] = [0]*a+[1]*b+[2]*c重写整个数组,不知道算不算是原地。但这样应该算是一趟扫描了
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
head = 0
for i in range(0,len(nums)):
if nums[i] == 0:
nums[head],nums[i] = nums[i],nums[head]
head += 1
for i in range(head,len(nums)):
if nums[i] == 1:
nums[head],nums[i] = nums[i],nums[head]
head += 1
复杂度分析
时间复杂度:O(n),其中 n 是数组 nums 的长度。
空间复杂度:O(1)。
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
p0 = p1 = 0
for i in range(0,len(nums)):
if nums[i] == 1:
nums[p1],nums[i] = nums[i],nums[p1]
p1 += 1
elif nums[i] == 0:
nums[p0],nums[i] = nums[i],nums[p0]
if p0 < p1:
nums[i], nums[p1] = nums[p1], nums[i]
p0 += 1
p1 += 1
复杂度分析
时间复杂度:O(n),其中 n 是数组 nums 的长度。
空间复杂度:O(1)。
class Solution:
def sortColors(self, nums: List[int]) -> None:
n = len(nums)
p0, p2 = 0, n - 1
i = 0
while i <= p2:
while i <= p2 and nums[i] == 2:
nums[i], nums[p2] = nums[p2], nums[i]
p2 -= 1
if nums[i] == 0:
nums[i], nums[p0] = nums[p0], nums[i]
p0 += 1
i += 1
复杂度分析
时间复杂度:O(n),其中 n 是数组 nums 的长度。
空间复杂度:O(1)。
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/sort-colors/solution/yan-se-fen-lei-by-leetcode-solution/