题目这道题目还是比较有意思的
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
要求仅使用常数空间的一趟扫描算法
示例
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
代码(其实有很多类似的题目,要求在原数组进行修改,一次遍历)
class Solution {
public void sortColors(int[] nums) {
//对特殊情况进行判断
if(nums.length<=1){return ;}
//定义一个标志位right,从后向前
int right=nums.length-1;
//定义一个标志位left,从前往后;
int left=0;
//index指向下一个0插入的位置
int index=0;
//注意这里一定是等号,例如nums{2,0,1},最后left指向数字0,righr也指向数字0,如果判断条件没有等号,最终排序结果将是1,0,2;
while(left<=right){
//如果当前位置left等于0,将left位置的数字与index位置的数字进行交换,
//前面也说了index始终指向下一个插入0的位置
//而且要注意一点,这个时候index位置的元素只可能是0或者1,不可能是2
//注意一点left左侧的元素一定是0和1,且一定有序,不可能存在2
if(nums[left]==0){
int temp=nums[index];
nums[left]=temp;
nums[index]=0;
left++;
index++;
//如果left位置是2的话,将left位置的元素与right位置的元素进行交换,我们从后往前插入2,right始终指向下一个插入2的位置;
//交换之后注意,left的位置是不变的,因为left位置交换后可能是0,1或者2,所以left不需要自增,但right需要自减指向下一个插入2的位置
}else if(nums[left]==2){
nums[left]=nums[right];
nums[right]=2;
right--;
}else{
//如果为1的话,left继续向右走
left++;
}
}
}
}