leetcode 第75題 顏色分類 python解法

leetcode 第75題 顏色分類 python解法

問題分析

先看題目
在這裏插入圖片描述
其實題目的要求很簡單,就是將一個僅包含0,1,2的數組進行排序,但是更高的要求時只是用常數空間,以及僅用一趟掃描。
所以這兩個要求就禁止了大多數的排序算法。好在這個數組只有三個數字0,1,2,也就是說排序後,數組的前面肯定都是0,後面都是2,中間都是1,這一點時可以確定的。那麼就有這樣一種思路,就是遍歷數組,如果是0,就移到前面,如果是2就移到後面,剩下中間的就是1了。
所以我的方法 就是使用雙指針first和last。first指針就是將要替換成0的位置,last指針就是要替換成2的位置。接下來遍歷數組,如果是0,先看當前位置是否大於first,如果相等,說明此位置之前都是0,因此不要操作,first加1後接着遍歷;如果當前位置大於first,則要進行交換。將0換到first指向的位置,當前位置的值因此也變化了,成爲1(只可能是1,因爲此位置之前的2全部都已經處理了),first加1接着遍歷。
如果遍歷到了2,當前位置與last比較,如果last指向的也是2,那麼last減去1,不然又將會把2換到前面,本程序會導致死循環。如果last不等於2,那麼交換兩個值,並且last減去1。但是此時還不能接着遍歷,因爲此時交換回來的值可能是0,可能還會再與first比較。
如果遍歷值是1,不用管繼續遍歷。
當遍歷的位置等於last的時候,就可以退出遍歷了,因爲last後面都是2,不用比較了。

源碼

class Solution:
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        first = 0
        last = len(nums) - 1
        i = 0
        while i < last:
            if nums[i] == 0:
                if i > first:
                    nums[first], nums[i] = nums[i], nums[first]
                i += 1
                first += 1
            elif nums[i] == 2:
                if nums[last] != 2:
                    nums[last], nums[i] = nums[i], nums[last]
                last -= 1
            else:
                i += 1

謝謝

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章