Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively. Note: You are not suppose to use the library's sort function for this problem. Example: Input: [2,0,2,1,1,0] Output: [0,0,1,1,2,2] Follow up:
|
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 注意: 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶:
|
思路:
第一种:题目中说的,迭代算出0,1,2分别出现了 多少次,然后按照0,1,2分别出现的 次数复制到原数组 中
class Solution {
public:
void sortColors(vector<int>& nums) {
int arr[3]={0},k=0;
for(int i=0;i<nums.size();++i)
arr[nums[i]]++;
for(int i=0;i<3;++i)
for(int j=0;j<arr[i];++j)
nums[k++]=i;
}
};
第二种:因为是红白蓝排序,所以使用两个指针,red指针从前往后,blue指针从后往前。若遇到为0的,red指针位置与其交换,若遇到为2的,blue指针与其交换,若遇到为1的,不用管。例如:[2,0,2,1,1,0],首先red 指针指向0位置的2,blue指针指向5 位置的0
[2,0,2,1,1,0]
[0,0,2,1,1,2] 从前往后遍历为2,blue位置与其交换,
[0,0,2,1,1,2]
[0,0,1,1,2,2] 遍历为2,与blue位置交换
[0,0,1,1,2,2]
class Solution {
public:
void sortColors(vector<int>& nums) {
int red=0, blue=nums.size()-1;
for(int i=0;i<=blue;++i) //注意这里i<=blue
{
if(nums[i]==0) swap(nums[i],nums[red++]);
else if(nums[i]==2) swap(nums[i--],nums[blue--]); //记得交换之后i--,从i前一个位置开始
}
}
};