给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
思路:
使用单指针index,将num[i]==0的元素与num是[index]交换。将所有0放到数组前面,然后再从当前索引index开始将nums[i]==1的元素与nums[index]进行交换,就可以得到结果。这种题思路要多画图,举个列子自己动手比划一下。
class Solution {
public:
void sortColors(vector<int>& nums) {
int index=0;
for(int i=0;i<nums.size();++i){
if(nums[i]==0){
swap(nums[i],nums[index]);
++index;
}
}
for(int i=index;i<nums.size();++i){
if(nums[i]==1){
swap(nums[i],nums[index]);
++index;
}
}
}
};
使用双指针p0,p1从0开始。p0用来交换nums[i]==0的元素,p1用来交换nums[i]==1的元素。主要的难点在于,保证p1之前的数字是先0后1才可以。关键在于时刻明白p0和p1的含义。可以看leetcode官方的演示图。
class Solution {
public:
void sortColors(vector<int>& nums) {
int p0=0,p1=0;
for(int i=0;i<nums.size();++i){
if(nums[i]==1){
swap(nums[i],nums[p1]);
++p1;
}
else if(nums[i]==0){
swap(nums[i],nums[p0]);
if(p0<p1){
swap(nums[i],nums[p1]);
}
p0++;
p1++;
}
}
}
};