给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。
我们可以使用整数 0,1 和 2 分别代表红,白,蓝。
注意事项
不能使用代码库中的排序函数来解决这个问题。
排序需要在原数组中进行。
样例
给你数组 [1, 0, 1, 2]
, 需要将该数组原地排序为 [0, 1, 1, 2]
。
思想:
设置两个指针left和right,分别指向第一个位置 和最后一个位置 ,然后设置一个遍历指针mid,从头开始进行遍历。
(1)若遍历到的位置为1,则说明它一定属于中部,根据总思路,中部的我们都不动,然后mid向前移动一个位置。
(2)若遍历到的位置为0,则说明它一定属于前部,于是就和left位置进行交换,然后mid向前移动一个位置,left也向前移动一个位置(表示前边的已经都排好了)。
(3)若遍历到的位置为2,则说明它一定属于后部,于是就和right位置进行交换,由于交换完毕后mid指向的可能是属于前部的,若此时mid前进则会导致该位置不能被交换到前部,所以此时mid不前进。而同1),right向前移动一个位置。
代码:
class Solution {
public:
/*
* @param nums: A list of integer which is 0, 1 or 2
* @return: nothing
*/
void sortColors(vector<int> &nums) {
// write your code here
int left = 0, right = nums.size() - 1;
int middle = 0;
// should be <= not <
while (middle <= right) {
if (nums[middle] == 0) {
swap(nums[middle], nums[left]);
left++;
middle++;
} else if (nums[middle] == 1) {
middle++;
} else {
swap(nums[middle], nums[right]);
right--;
}
}
}
};
思路二:
【思路二】
(1)遍历数组,统计红白蓝三色球(0,1,2)的个数
(2)根据红白蓝三色球(0,1,2)的个数重排数组
时间复杂度:O(n)
【代码】
[cpp] view plain copy
- class Solution {
- public:
- void sortColors(int A[], int n) {
- if(n <= 1){
- return;
- }//if
- // 统计个数
- int red = 0,white = 0,blue = 0;
- for(int i = 0;i < n;++i){
- if(A[i] == 0){
- ++red;
- }//if
- else if(A[i] == 1){
- ++white;
- }//else
- else{
- ++blue;
- }//else
- }//for
- // 重新布局
- for(int i = 0;i < n;++i){
- if(red > 0){
- A[i] = 0;
- --red;
- }//if
- else if(white > 0){
- A[i] = 1;
- --white;
- }//else
- else{
- A[i] = 2;
- }
- }//for
- }
- };