本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
Sort Colors
Total Accepted: 13005 Total Submissions: 41941Given an array with n objects colored red, white or blue, sort them 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.
Follow up:
A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.
Could you come up with an one-pass algorithm using only constant space?
题意:一个元素的值为0,1,2的数组,将其将0,1,2顺序排序
思路:
也是快排中的partition思想。不过这次用的是one versus all,可以推广到其他任意多个颜色
第一次设一个下标为界,将数组分为一边为0,一边非0
第两次设另一个下村为界,将非0的那部分分为一边为1,一边为2
注意void sortColors(int A[], int n) 这里的A虽然以数组的形式声明,但实际上是指针,改变这里数组A里元素的值,会对应改变传到它的参数的值。
复杂度:时间O(n), 空间O(1)
class Solution {
public:
void sortColors(int A[], int n) {
int i = -1;
for(int j = 0; j < n; j++){
if(A[j] == 0) swap(A[++i], A[j]);
}
for(int j = i; j < n; j++){
if(A[j] == 1) swap(A[++i], A[j]);
}
}
};