Facebook面試題專題4 - leetcode75. Sort Colors
阿新 • • 發佈:2018-12-19
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的原因。可以先直接用(拙劣易懂版)做