75. Sort Colors
Description
Intuition
这题这样做,假设分类0, 1, 2
,我们将使用三个指针
- notZero: 永远指向第一个不是0的数字
- notOne: 永远指向第一个不是1的数字
- notTwo: 永远指向第一个不是2的数字
procedure three-way-partition(A : array of values, mid : value):
i ← 0
j ← 0
n ← size of A - 1
while j ≤ n:
if A[j] < mid:
swap A[i] and A[j]
i ← i + 1
j ← j + 1
else if A[j] > mid:
swap A[j] and A[n]
n ← n - 1
else:
j ← j + 1
Starting 0
swap notZero
and notOne
notZero
moves, notOne
moves
Starting 1
notOne
moves
Starting 2
swap with notOne
and notTwo
notTwo
moves
此时不可以move notOne
,交换过去的可以是0,也可以是1
Pitfall
Solution
public void sortColors(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
int firstNotZero = 0, firstNotSecond = nums.length - 1;
// 需要使用等于号,因为i并未经过firstNotSecond, <tt>firstNotSecond</tt>
for (int i = 0; i <= firstNotSecond; ) {
if (nums[i] == 0) {
swap(nums, i, firstNotZero);
i++;
firstNotZero++;
} else if (nums[i] == 1) {
i++;
} else {
// this is a swapping number [0, 1] to position i
swap(nums, i, firstNotSecond);
firstNotSecond--;
}
}
}
private static void swap(final int[] nums, final int i, final int j) {
final int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
Reference
- Wikipedia
- CSDN Blog
- Leetcode Discussion-1-pass-in-place-solution-with-explanation)
- Share my at most two-pass constant space 10-line solution