题意是: 对只含0,1,2三个元素的数组进行排序。由于只含3个元素,O(nlogn)肯定不是一个好的算法。
1,首先能想到的是计数排序,时间复杂度O(n), 空间复杂度O(1):
public class Solution {
public void sortColors(int[] A) {
// Start typing your Java solution below
// DO NOT write main() function
int len = A.length;
if(len <= 1) return;
int numOfRed = 0, numOfWhite = 0, numOfBlue = 0;
for(int i = 0; i < len; i ++)
{
if(A[i] == 0) numOfRed ++ ;
else if(A[i] == 1) numOfWhite ++ ;
else numOfBlue ++ ;
}
int index = 0;
while(numOfRed -- > 0)
{
A[index++] = 0;
}
while(numOfWhite -- > 0)
{
A[index++] = 1;
}
while(numOfBlue -- > 0)
{
A[index++] = 2;
}
}
}
2,由于数组中只包含0,1,2。所以排序后的数组可以分为3部分,这样我们排序的过程可以是:遍历数组,遇到0就把它放到第一部分,遇到2就放到第三部分。这样处理完也就有序了。复杂度也是O(n)。
public class Solution {
public void sortColors(int[] A) {
// Start typing your Java solution below
// DO NOT write main() function
int len = A.length;
if(len <= 1) return;
int indexOfRed = len, indexOfBlue = -1;
for(int i = 0; i < len; i ++)
{
if(A[i] != 0)
{
indexOfRed = i ;
break;
}
}
for(int i = len - 1; i >= 0; i --)
{
if(A[i] != 2)
{
indexOfBlue = i ;
break;
}
}
int p = indexOfRed;
while(p <= indexOfBlue)
{
if(A[p] == 0)
{
int tmp = A[indexOfRed];
A[indexOfRed] = A[p];
A[p] = tmp;
p ++ ;
indexOfRed ++ ;
}
else if(A[p] == 2)
{
int tmp = A[indexOfBlue];
A[indexOfBlue] = A[p];
A[p] = tmp;
indexOfBlue -- ;
}
else p ++ ;
}
}
}