Given an array 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.
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
Note: You are not suppose to use the library's sort function for this problem.
Example:
Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]
Follow up:
- A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's. - Could you come up with a one-pass algorithm using only constant space?
Language: java
class Solution {
public void sortColors(int[] nums) {
int left = 0, mid = 0, right = nums.length - 1;
while(mid <= right){
if(nums[mid] == 2){
swap(nums, mid, right);
right--;
}else if(nums[mid] == 1){
mid++;
}else{
swap(nums, left, mid);
left++;
mid++;
}
}
}
public void swap(int[] nums, int i, int j){
if(i != j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
Analysis:
- Two Pointers;
- Dutch flag question;
Submission Detail
Accepted Solutions Runtime Distribution
Accepted Solutions Memory Distribution
Language: Python
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
i = current = 0
j = len(nums) - 1
while current <= j:
if nums[current] == 0:
nums[i], nums[current] = nums[current], nums[i]
i += 1
current += 1
elif nums[current] == 1:
current += 1
else:
nums[current], nums[j] = nums[j], nums[current]
j -= 1
Submission Detail
Accepted Solutions Runtime Distribution
Accepted Solutions Memory Distribution
Summary:
- Java runtime is shorter than Python;
- Java uses more memory than Python;