概述
给定一个包含红色、白色和蓝色,一共 n
个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
示例 3:
输入:nums = [0]
输出:[0]
示例 4:
输入:nums = [1]
输出:[1]
解题思路
如果数组长度为n
,设置两个指针zeroEdge
和twoEdge
分别作为红色部分的边界和蓝色部分的边界,即[0,zeroEdge
)的值都为0
,(twoEdge,n-1]
的值都为2
,[zeroEdge,twoEdge]
的值都为1
。通过不断遍历数组,判断当前数字是该与zeroEdge
或者twoEdge
位置的数字交换,还是留在此处,然后继续判断下一位数。
解题代码
class Solution {
public void sortColors(int[] nums) {
int n= nums.length;
int zeroEdge=0;
int twoEdge=n-1;
int i=0;
while (i<=twoEdge){
while (i>=zeroEdge&&i<=twoEdge&&(nums[i]==0||nums[i]==2)){
if (nums[i]==0){
swap(nums,i,zeroEdge);
zeroEdge++;
}else {
swap(nums,i,twoEdge);
twoEdge--;
}
}
i++;
}
}
public void swap(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}