一、题目
二、解法1(笨方法)
初时,想的是走两趟
class Solution {
public void sortColors(int[] nums) {
int i = 0;
int tmp = 0;
for (int k = 0; k < nums.length; k++) {
if (nums[k] == tmp) {
// 相等的话,i++
if(k != i) {
int val = nums[k];
nums[k] = nums[i];
nums[i] = val;
}
i++;
}
}
// 遍历一次,加一次,i处的元素没有经过判断
tmp++;
for (int k = i; k < nums.length; k++) {
if (nums[k] == tmp) {
if(k != i) {
int val = nums[k];
nums[k] = nums[i];
nums[i] = val;
}
i++;
}
}
}
}
时间复杂度为O(2n),也就是O(n)
但这种解法什么情况都想到了,不太聪明呀。
解法2:
class Solution {
public void sortColors(int[] nums) {
// 使用两个指针,记录最左边和最右边的边界
int p1 = 0, cur = 0;
int p2 = nums.length - 1;
// cur和p2相等的时候,只剩最后一个元素
int tmp = 0;
// 每个元素都得判断
while (cur <= p2) {
if (nums[cur] == 0) {
tmp = nums[cur];
// 这样的自增、自减很好用
nums[cur++] = nums[p1];
nums[p1++] = tmp;
} else if (nums[cur] == 2) {
tmp = nums[cur];
// 换过来的元素万一是0,还是得判断
nums[cur] = nums[p2];
nums[p2--] = tmp;
}
else cur++;
}
}
}
时间复杂度为O(n), 空间复杂度为O(1)