题目描述

题解
// 我写了个快排,然后stackoverflow,通不过,看来分治递归的方法不能直接用。
//
// 双指针法
// 构建p0指针专门看0,从头开始遍历,构建p2指针专门看2,从尾开始遍历,
// 构建交换位置函数swap。
// for循环遍历nums元素,遍历元素为nums[i],索引i遇到p2停止,
// 构建第二层while循环,当i小于等于p2指针时,如果nums[i]当前遍历元素为2,
// 说明nums[i]需要放到数组尾部,将nums[i]和nums[p2]交换,之后p2左移一位。
// 用while循环而不用if是防止当前nums[p2]也为2,此时nums[i]和nums[p2]交换,
// 换了个寂寞。所以while循环可以让p2左移直到nums[i]的2真的被换走,
// 从nums[p2]换来的新nums[i]已经不再是2了,while就终止了。
// 之后条件判断,如果nums[i]为0,交换nums[i]和nums[p0],p0是从头开始往右,
// 所以所有nums[i]发现的0都会被p0指针换到数组头部。直到i与p2指针相遇,
// for循环终止,则排序结束。
//
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:37.1 MB, 在所有 Java 提交中击败了30.44%的用户
class Solution {
public void sortColors(int[] nums) {
int p0 = 0, p2 = nums.length - 1
for (int i = 0
while (i <= p2 && nums[i] == 2) {
swap(nums, i, p2)
p2--
}
if (nums[i] == 0) {
swap(nums, i, p0)
p0++
}
}
}
public void swap(int[] nums, int i, int j) {
int temp = nums[i]
nums[i] = nums[j]
nums[j] = temp
}
}