leetcoad链接:https://leetcode-cn.com/problems/sort-colors/
视频链接:https://www.algomooc.com/567.html
方法一:暴力解法
方法二:双指针
解题思路:不能重新构建新的数组,可以将输出的结果划分为三份,设置两个标定点,标定点左边位置是0,标定点的右边位置都是2
- left指针,指向数组开始的位置,它指向的位置的左侧都是0
- right指针,它指向数组结束的位置,它指向的位置的右侧都是2
- index指针:指向数组开始的位置
- index指针向后移动,越过right指针的时候,就可以跳出循环,不需要再进行相应的判断了(这里的理解很重要:因为前面已经锁定right指针右边都是2了)
- 获取当前元素的值:cur = nums[index]
- 如果index位置上的元素为0
- 说明是红色的,放在最前面去,让index指向的元素和left指向位置上的元素进行交换
- 同时让index和left都要向后面进行移动
- 如果Index位置上的元素是1
- 说明是白色,不用管,然后继续移动index
- 如果index位置上的值是2
- 说明是蓝色,需要放到后面去
- 让index指针指向的元素和right指针指向的元素进行交换
class Solution:
def sortColors(self, nums: List[int]) -> None:
left, index = 0 , 0
right = len(nums) - 1
while index <= right:
cur = nums[index]
if cur ==0:
self.swap(nums,index,left)
index +=1
left +=1
if cur == 1:
index +=1
if cur ==2:
self.swap(nums,index,right)
right -=1
def swap(self, nums: List[int],i:int,j:int):
tmp = nums[i]
nums[i] = nums[j]
nums[j] = tmp