一、题目


二、解法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)
本文探讨了荷兰国旗问题的两种解决方案。第一种方法通过两趟遍历来实现,虽然简单但效率不高。第二种方法采用双指针技巧,仅需一趟遍历即可完成排序,大大提高了算法效率。
347

被折叠的 条评论
为什么被折叠?



