问题描述:
给定一个包含红色、白色和蓝色,一共 n
个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数0
、 1
和 2
分别表示红色、白色和蓝色。
注意: 不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。
- 首先,迭代计算出
0
、1
和2
元素的个数,然后按照0
、1
、2
的排序,重写当前数组。 - 你能想出一个仅使用常数空间的一趟扫描算法吗?
问题分析:
方法1:进阶已经给出。
(1)先分别统计0
、1
、2
的个数。
(2)然后根据大小重写 nums
数组。
方法2: 双指针方法
(1)用指针 i
负责统计 0
的个数,指针 j
负责统计 0
和1
的总个数。
(2)遍历 nums
数组,先取出当前元素 v
,然后把当前位置赋值为 2
。
(3)判断 v
如果小于 2
,j
指针就加一,把当前位置变为 1
。
(4)紧跟(3)后面,继续判断 v
是否为 0
,如果为 0
,i
指针走一位置。
(5)直到遍历结束。
Python3实现:
方法1:
# @Time :2018/12/02
# @Author :LiuYinxing
class Solution:
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
cnt = [0] * 3
for v in nums: # 统计个数
cnt[v] += 1
j = 0
for i in range(3): # 根据大小重写 nums 数组
while cnt[i]:
nums[j] = i
j += 1
cnt[i] -= 1
if __name__ == '__main__':
nums = [0, 2, 1, 0, 2, 1, 0]
Solution().sortColors(nums)
print(nums)
方法2:
class Solution:
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
i = j = 0 # j 负责记录 0 、1 的个数, i 负责记录 0 的个数。
for k in range(len(nums)):
v = nums[k]
nums[k] = 2
if v < 2: # 只要小于 2 就写入1
nums[j] = 1
j += 1
if v == 0: # 然后判断 0 的情况。
nums[i] = 0
i += 1
if __name__ == '__main__':
nums = [0, 2, 1, 0, 2, 1, 0]
Solution().sortColors(nums)
print(nums)
声明: 总结学习,有问题或不妥之处,可以批评指正哦。