-
-
Save anish000kumar/a505616e75c96e00732bb622378df93d to your computer and use it in GitHub Desktop.
class Solution: | |
def sortColors(self, nums: List[int]) -> None: | |
""" | |
Do not return anything, modify nums in-place instead. | |
""" | |
start, end = 0, len(nums)-1 | |
i = start | |
while i <= end: | |
if nums[i] == 0: | |
nums[start], nums[i] = nums[i] ,nums[start] | |
start += 1 | |
# traveller pointer must never be behind start pointer | |
if start > i: i = start | |
elif nums[i] == 2: | |
nums[end], nums[i] = nums[i] ,nums[end] | |
end -= 1 | |
else: | |
i += 1 | |
class Solution: | |
def sortColors(self, nums: List[int]) -> None: | |
""" | |
Do not return anything, modify nums in-place instead. | |
""" | |
i, left, right = 0, 0, len(nums)-1 | |
while i <= right: | |
if nums[i] == 0 and i >= left: | |
nums[i], nums[left] = nums[left], nums[i] | |
left += 1 | |
elif nums[i] == 2 and i <= right: | |
nums[i], nums[right] = nums[right], nums[i] | |
right -= 1 | |
else: | |
i += 1 |
Quick explanation:
-
There are two boundary pointers: left and right
-
anything before left must be 0
-
anything after right must be 2
-
There's one iterating pointer i.e. i
-
so we start from left and keep moving till we reach right (out of bounds region for left and right/ unknown region for i)
-
If i comes across 0: "Hey, left seems your item is misplaced, take this within your boundary". So we swap item at i and left and left moves one step ahead to mark the new boundary
-
Same things happens between right and i, if i comes across 2
Now whenever a swap happens, i gets a new unknown item in exchange, hence it doesn't move to ensure the new item is explored in next iteration of the loop. When a swap doesn't happen, i knows the item is at right place so it just moves a step forward
https://leetcode.com/problems/sort-colors