75. Sort Colors
英语流利说面试题
题目描述
(三色排序)给出一个由红、白、蓝三种颜色组成的数组,把相同颜色的元素放到一起,并整体按照红、白、蓝的顺序。用0表示红色,1表示白色,2表示蓝色。
例子
Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]
思想
(法1) - 遍历两遍
第一遍可以用三个指针分别对0、1和2进行计数;第二遍赋值
(法2) - 三指针
如果只有两种颜色,那么容易想到一前一后两个指针向中间遍历,颜色不对就交换位置。
三种颜色仍然可以这么做,只不过要多一个指针,前后两个指针用来分隔已经排好的0和2(保证两指针区间的前面都是0,后面都是2),中间的指针来遍历元素。
1)nums[mid]为2,和nums[r]的交换,且更新r -= 1;
2)nums[mid]为1,不需要交换,更新mid += 1;
3)nums[mid]为0,和nums[l]的交换,且更新l += 1。
假设nums[mid]=0,若mid=l,需要同时右移;若mid > l,则【0,1…l-1】都是0,【l… mid -1】都是1,nums[l]肯定是1。3)中与nums[l]交换后nums[mid]肯定为1,需要更新一下。
解法
(改进版)
class Solution(object):
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
l = mid = 0
r = len(nums)-1
while mid <= r:
if nums[mid] == 0:
nums[l], nums[mid] = nums[mid], nums[l]
l += 1
mid += 1
elif nums[mid] == 2:
nums[r], nums[mid] = nums[mid], nums[r]
r -= 1
else:
mid += 1
易懂版
class Solution(object):
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
l = mid = 0
r = len(nums)-1
while mid <= r:
if nums[mid] == 0:
if mid == l:
mid += 1
l += 1
else:
nums[l], nums[mid] = nums[mid], nums[l]
l += 1 # nums[mid]值为1, 下一轮需要mid+=1
elif nums[mid] == 2:
nums[r], nums[mid] = nums[mid], nums[r]
r -= 1
else:
mid += 1
More
脑子转不过来,想了很久mid+=1的原因。可以先直接用(拙劣易懂版)做