###### tags: `Leetcode` `medium` `pointer` `array` `python` `Top 100 Liked Questions` # 75. Sort Colors ## [題目連結:] https://leetcode.com/problems/sort-colors/ ## 題目: Given an array ```nums``` with ```n``` objects colored red, white, or blue, sort them ```in-place``` so that objects of the same color are adjacent, with the colors in the order red, white, and blue. We will use the integers ```0, 1, and 2``` to represent the color red, white, and blue, respectively. You must solve this problem without using the library's sort function. **Follow up:** Could you come up with a one-pass algorithm using **only constant extra space**? **Example 1:** ``` Input: nums = [2,0,2,1,1,0] Output: [0,0,1,1,2,2] ``` **Example 2:** ``` Input: nums = [2,0,1] Output: [0,1,2] ``` ## 解題想法: * 題目要求將球依序0-1-2擺放 * in-place * space: O(1) * 0:red * 1:white * 2:blue * 用三個pointer維護: * cur_pos = 0 * 當前位置 * forTwo_pos = len(nums)-1 * 該位置以**右**都為2 * forOne_pos = 0 * 該位置以**左**都為0 * 判斷當前**cur_pos指到的值** * 終止條件為**cur_pos已超過forTwo_pos** * 若為2 :則與forTwo_pos的值交換 then forTwo_pos-1 * 若為0 :則與forOne_pos的值交換 then forOne_pos+1、**cur_pos+1** * 若為1 :則cur_pos+1 ## Python: ``` python= class Solution(object): def sortColors(self, nums): """ :type nums: List[int] :rtype: None Do not return anything, modify nums in-place instead. """ #用三個pointer維護 cur_pos = 0 #當前位置 forTwo_pos = len(nums)-1 #該位置以右都為2 forOne_pos = 0 #該位置以左都為0 while cur_pos<=forTwo_pos: if nums[cur_pos]==2: nums[cur_pos],nums[forTwo_pos]=nums[forTwo_pos],nums[cur_pos] forTwo_pos-=1 elif nums[cur_pos]==0: nums[cur_pos],nums[forOne_pos]=nums[forOne_pos],nums[cur_pos] forOne_pos+=1 cur_pos+=1 else: cur_pos+=1 if __name__ == '__main__': result = Solution() nums = [2,0,2,1,1,0] ans = result.sortColors(nums) print(nums) ```