算法
(双指针) $O(n)$
这题一眼扫过去我们很自然的想到了$sort$大法,但题目不让用,所以就按题目要求做吧。
本题实质上是找出两条分割线,分别是$0$和$1$之间的分割线$zero$,使得$zero$左边的元素都是$0$,以及$1$和$2$之间的分割线$two$,使得$two$右边的元素都是$2$,而中间剩下的就是$1$。
Java 代码
class Solution {
public void sortColors(int[] nums) {
// zero: i < zero -> a[i] = 0
// two: i > two -> a[i] = 2
// a[i] = 0: swap(i, zero); zero++
// a[i] = 2: swap(i, two); two--
// a[i] = 1: i++
int zero = 0;
int two = nums.length - 1;
int i = 0;
while (i <= two) {
if (nums[i] == 0) {
swap(nums, zero, i);
zero++;
}
if (nums[i] == 2) {
swap(nums, i, two);
two--;
}
if (nums[i] == 1) i++;
i = Math.max(i, zero);
}
}
private void swap(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}