Back to writing

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.

 

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]

 

Constraints:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i] is either 0, 1, or 2.

 

Follow up: Could you come up with a one-pass algorithm using only constant extra space?


 class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
#         for i in range(len(nums)):
#             min_index = i

#             for j in range(i+1, len(nums)):
#                 if nums[min_index] > nums[j]:
#                     min_index = j

#             nums[min_index], nums[i] =   nums[i] , nums[min_index]


        # using counting sort
        M = 2
        counter = [0]*(M+1)

        for item in nums:
            counter[item] += 1

        starting_index = 0
        for i, count in enumerate(counter):
            counter[i] = starting_index
            starting_index += count

        sorted_list = [0]*len(nums)
        for item in nums:
            sorted_list[counter[item]] = item
            counter[item]+=1

        for i in range(len(nums)):
            nums[i] = sorted_list[i]

From python 3.7 dict guarantees that order will be kept as they inserted, and popitem will use LIFO order but we need FIFO type system. so we need OrderedDict which have popIten(last = T/F) for this req. One thing, next(iter(dict)) will return the first key of the dict

Python