Leetcode 75.颜色分类
1 题目描述(Leetcode题目链接)
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
- 你能想出一个仅使用常数空间的一趟扫描算法吗?
2 题解
最直观解法的也就是题目中所说,计算0、1、2的数目然后再按照顺序填写。
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
colors = {0:0, 1:0, 2:0}
for i in nums:
colors[i] += 1
index = 0
for key, value in colors.items():
while value > 0:
nums[index] = key
index += 1;value -= 1
按照题目中的进阶方法,值用常数空间的一趟扫描,可以使用三指针的方法(荷兰国旗问题),可以定义 l e f t left left和 r i g h t right right为左边0和右边1的边界, m i d mid mid起始位置和 l e f t left left相同。当 m i d ≤ r i g h t mid \le right mid≤right时有:
- 如果 m i d mid mid为0,则与 l e f t left left交换位置,然后 m i d mid mid和 l e f t left left自增1,继续循环;
- 如果 m i d mid mid为2,则与 r i g h t right right交换位置,然后 r i g h t right right自减1,继续循环;
- 否则 m i d mid mid自增1
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
length = len(nums)
left = 0; right = length - 1; mid = left
while mid <= right:
if nums[mid] == 0:
temp = nums[mid];
nums[mid] = nums[left];
nums[left] = temp;
left += 1; mid += 1;
continue
elif nums[mid] == 2:
temp = nums[mid];
nums[mid] = nums[right];
nums[right] = temp;
right -= 1;
continue
mid += 1