75. Sort Colors
leetcode medium
Task
Дан массив nums, содержащий n объектов, окрашенных в красный, белый или синий цвет. Отсортируйте их на месте так, чтобы объекты одного цвета находились рядом, а цвета располагались в порядке красный, белый и синий.
Мы будем использовать целые числа 0, 1 и 2 для обозначения красного, белого и синего цветов соответственно.
Вы должны решить эту задачу без использования функции сортировки библиотеки.
Пример:
Input: nums = [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]
C# solution
matched/originalpublic class Solution {
public void SortColors(int[] nums) {
var p0 = 0;
var curr = 0;
var p2 = nums.Length - 1;
while (curr <= p2) {
if (nums[curr] == 0) {
int temp = nums[p0];
nums[p0++] = nums[curr];
nums[curr++] = temp;
} else if (nums[curr] == 2) {
int temp = nums[curr];
nums[curr] = nums[p2];
nums[p2--] = temp;
} else
curr++;
}
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public void SortColors(vector<int>& nums) {
var p0 = 0;
var curr = 0;
var p2 = nums.size() - 1;
while (curr <= p2) {
if (nums[curr] == 0) {
int temp = nums[p0];
nums[p0++] = nums[curr];
nums[curr++] = temp;
} else if (nums[curr] == 2) {
int temp = nums[curr];
nums[curr] = nums[p2];
nums[p2--] = temp;
} else
curr++;
}
}
}Java solution
matched/originalclass Solution {
public void sortColors(int[] nums) {
int p0 = 0, curr = 0;
int p2 = nums.length - 1;
int tmp;
while (curr <= p2) {
if (nums[curr] == 0) {
tmp = nums[p0];
nums[p0++] = nums[curr];
nums[curr++] = tmp;
} else if (nums[curr] == 2) {
tmp = nums[curr];
nums[curr] = nums[p2];
nums[p2--] = tmp;
} else {
curr++;
}
}
}
}JavaScript solution
matched/originalvar sortColors = function (nums) {
let p0 = 0,
curr = 0;
let p2 = nums.length - 1;
while (curr <= p2) {
if (nums[curr] == 0) {
[nums[curr++], nums[p0++]] = [nums[p0], nums[curr]];
} else if (nums[curr] == 2) {
[nums[curr], nums[p2--]] = [nums[p2], nums[curr]];
} else curr++;
}
};Python solution
matched/originalclass Solution:
def sortColors(self, nums: List[int]) -> None:
p0 = curr = 0
p2 = len(nums) - 1
while curr <= p2:
if nums[curr] == 0:
nums[p0], nums[curr] = nums[curr], nums[p0]
p0 += 1
curr += 1
elif nums[curr] == 2:
nums[curr], nums[p2] = nums[p2], nums[curr]
p2 -= 1
else:
curr += 1Go solution
matched/originalfunc sortColors(nums []int) {
p0, curr := 0, 0
p2 := len(nums) - 1
for curr <= p2 {
if nums[curr] == 0 {
nums[curr], nums[p0] = nums[p0], nums[curr]
curr++
p0++
} else if nums[curr] == 2 {
nums[curr], nums[p2] = nums[p2], nums[curr]
p2--
} else {
curr++
}
}
}Explanation
Algorithm
1️⃣
Инициализация крайней правой границы нулей: p0 = 0. Во время выполнения алгоритма nums[idx < p0] = 0.
2️⃣
Инициализация крайней левой границы двоек: p2 = n - 1. Во время выполнения алгоритма nums[idx > p2] = 2.
3️⃣
Инициализация индекса текущего элемента для рассмотрения: curr = 0.
Пока curr <= p2:
Если nums[curr] = 0: поменять местами элементы с индексами curr и p0, и сдвинуть оба указателя вправо.
Если nums[curr] = 2: поменять местами элементы с индексами curr и p2. Сдвинуть указатель p2 влево.
Если nums[curr] = 1: сдвинуть указатель curr вправо.
😎