Sort Colors -- LeetCode

原题链接: http://oj.leetcode.com/problems/sort-colors/
这道题也是数组操作的题目,其实就是要将数组排序,只是知道数组中只有三个元素0,1,2。熟悉 计数排序 的朋友可能很快就发现这其实就是使用计数排序,元素空间只需要三个元素即可。代码如下:
public void sortColors(int[] A) {
    if(A==null || A.length==0)
        return;
    int[] res = new int[A.length];
    int[] helper = new int[3];
    for(int i=0;i=0;i--)
    {
        res[helper[A[i]]-1] = A[i];
        helper[A[i]]--;
    }
    for(int i=0;i
上面的代码是计数排序的标准解法,可以看到总共进行了三次扫描,其实最后一次只是把结果数组复制到原数组而已,如果不需要in-place的结果只需要两次扫描。
其实就算返回元素组也可以是两次扫描,这需要用到元素只有0,1,2的本质。我们知道helper[i]中是包含着0,1,2的元素数量,我们只需要按照helper[0,1,2]的数量依次赋值过来即可(每层循环把helper[i]--,如果helper[i]到0就i++就可以了),只是这样就不是计数排序比较标准的解法,我希望还是复习一下。
这种方法的时间复杂度是O(2*n),空间是O(k),k是颜色的数量,这里是3。
上述方法需要两次扫描,我们考虑怎么用一次扫描来解决。其实还是利用了颜色是三种这一点,道理其实也简单,就是搞两个指针,一个指在当前0的最后一个下标,另一个是指在当前1的最后一个下标(2不需要指针因为剩下的都是2了)。进行一次扫描,如果遇到0就两个指针都前进一步并进行赋值,如果遇到1就后一个指针前进一步并赋值。代码如下:
public void sortColors(int[] A) {
    if(A==null || A.length==0)
        return;
    int idx0 = 0;
    int idx1 = 0;
    for(int i=0;i
上述方法时间复杂度还是O(n),只是只需要一次扫描,空间上是O(1)(如果颜色种类是已知的话)。
这道题我觉得主要还是熟悉一下 计数排序 计数排序 是线性排序中比较重要的一种,关于排序要搞个专题专门的复习一下,很多排序的基本思想都对解题有帮助哈。

你可能感兴趣的:(Sort Colors -- LeetCode)