荷兰国旗问题:
方法一:
本解的关键点:
因为curr左边的值已经扫描过了,所以curr要++继续扫描下一位,而与p2交换的值,curr未扫描,要停下来扫描一下,所以curr不用++。
class Solution {
public void sortColors(int[] nums) {
int p0= 0,cur = 0,p2 = nums.length-1;
while(cur<=p2){
int tmp;
if(nums[cur] == 0){
tmp = nums[p0];
nums[p0++] = nums[cur];
nums[cur++] = tmp;
}
else if(nums[cur] == 2){
tmp = nums[p2];
nums[p2--] = nums[cur];
nums[cur] = tmp;
}
else{
cur++;
}
}
}
}
方法二:
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
class Solution {
public void sortColors(int[] nums) {
int zero = 0,one = 0,two = 0;
for(int i = 0;i<nums.length;i++){
if(nums[i] == 0) zero++;
if(nums[i] == 1) one++;
if(nums[i] == 2) two++;
}
int index = 0;
for(int i = 0;i<zero;i++){
nums[index] = 0;
index++;
}
for(int i = 0;i<one;i++){
nums[index] = 1;
index++;
}
for(int i = 0;i<two;i++){
nums[index] = 2;
index++;
}
}
}