75.颜色分类
题目:
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
解法:
方法一:双指针(两遍循环)
我们可以考虑对数组进行两次遍历。在第一次遍历中,我们将数组中所有的 0交换到数组的头部。在第二次遍历中,我们将数组中所有的 1交换到头部的 0之后。此时,所有的 2 22 都出现在数组的尾部,这样我们就完成了排序。
具体地,我们使用一个指针 j 表示「头部」的范围, j 中存储了一个整数,表示数组 nums 从位置 0 到位置 j-1 都属于「头部」。 j 的初始值为 0,表示还没有数处于「头部」。
在第一次遍历中,我们从左向右遍历整个数组,如果找到了 0,那么就需要将 0 与「头部」位置的元素进行交换,并将「头部」向后扩充一个位置。在遍历结束之后,所有的 0 都被交换到「头部」的范围,并且「头部」只包含 0。
在第二次遍历中,我们从「头部」开始,从左向右遍历整个数组,如果找到了 1,那么就需要将 1 与「头部」位置的元素进行交换,并将「头部」向后扩充一个位置。在遍历结束之后,所有的 1都被交换到「头部」的范围,并且都在 0之后,此时 2只出现在「头部」之外的位置,因此排序完成。
class Solution(object):
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: None Do not return anything, modify nums in-place instead.
"""
n = len(nums)
j = 0
for i in range(n):
if nums[i]==0:
nums[i],nums[j]=nums[j],nums[i]
j += 1
for i in range(j,n):
if nums[i]==1:
nums[i],nums[j]=nums[j],nums[i]
j += 1
return nums
————————————————
版权声明:本文为CSDN博主「稚嫩的劢劢」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Mai_M/article/details/109822276