1. 程式人生 > >Facebook面試題專題4 - leetcode75. Sort Colors

Facebook面試題專題4 - leetcode75. Sort Colors

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的原因。可以先直接用(拙劣易懂版)做