https://leetcode-cn.com/problems/sort-colors/solution/yan-se-fen-lei-by-leetcode/
1.荷兰国旗问题:数组只包含0,1,2对其排序
(1)首先最简单的就是计数排序,当然这里不讨论,一般情况下考察的都不是这个
(2)和快排划分过程相似:时间O(n),空间O(1)。
快排划分的时候有个标志位 i=left-1,如果a[j]>x,j++,i++否则j++,i++,a[j] a[i]互换位置.而该题目可以设置两个标志位,i,j,一个在最左边一个在最右边。对于数组a[0~n-1],初始i=0,j=n;
遍历元素和1比较:
1)如果=1,直接k++,考察下一个数
2)如果=0,左边标志位i++,a[k]a[i]进行交换,考察下一个数
3)如果=2,右边标志位j–,a[k][j]交换,注意这里不能直接考察下一个数,要在对a[k]与1进行比较,a[j]可能是0 1 或者2,所以此时只要将当前位置k不变在做一次比较即可。
4)直到当前位置k和右边标记j相同时,停止
[0,1,1,0,2,2],6
返回:[0,0,1,1,2,2]
public class ThreeColor {
public int[] sortThreeColor(int[] a, int n) {
// write code here
int i=-1;
int j=n;
for(int k=0;k<j;k++){
if(a[k]==1) continue;
if(a[k]==0){
i++;
int temp=a[i];
a[i]=a[k];
a[k]=temp;
continue;
}
if(a[k]==2){
j--;
int temp=a[j];
a[j]=a[k];
a[k]=temp;
k--;
}
}
return a;
}
}
public void sortColors(int[] nums) {
int left = 0;
int right = nums.length-1;
for(int i=0; i<=right; i++) {
if(nums[i] == 1)
continue;
if(nums[i] == 0) {
int temp = nums[left];
nums[left] = nums[i];
nums[i] = temp;
left++;
}else if(nums[i] == 2) {
int temp = nums[right];
nums[right] = nums[i];
nums[i] = temp;
right--;
i--; //特别注意
}
}
}