首页 > 代码库 > LEETCODE Sort Colors

LEETCODE Sort Colors

Given 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.

click to show follow up.

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?

  这个题考排序。

  题目要求不用计数法排序,因此首先想到的是三色排序法,即最小的丢一头,最大的丢一头,中间的不管,到了最后就自然排好序了。

  还是说说自己遇到的问题:

  1. for循环还是while循环。在这个题目中,如果交换了一次数字,指针不能立即前行,而应再比较一次。(比如2和0交换,0还应和前面一头交换才算完成)。所以指针并不是一直在相加,因此while循环更合适。

  2. 每遇见一次0则首指针加1,每遇见一次2则尾指针减1.因此明显循环只需要执行到尾指针处(包含尾指针,因为当前尾指针指向的值不一定为2)。但有问题:如果当前指针和头指针相同,且当前元素为0(需要调整)怎么办?首先它不需要交换。其次头指针需要加一。当前指针需要加一。

  3. 同问题1所描述那样,指针不能立即前行,再比较一次。这“一次”怎么处理?当前指针不动,头或尾指针变化,然后再重新循环。这样每次交换的值都不一样,直到交换到一个1,或者循环不满足条件退出为止。这时候就应注意循环条件为i<=end而不是A.length-1,否则若[2,0]这样的输入就是死循环。

  代码如下。

public class Solution {
    public void sortColors(int[] A) {
        int start = 0;
        int end = A.length-1;
        int i = start;
        while (i<=end){
            if(A[i]==0){
                if(i>start){
                A[i] = A[start];
                A[start] = 0;
                i--;
                }
                start++; 
                i++;
            }
            else if (A[i] == 2){
                if(i<end){
                A[i] = A[end];
                A[end] = 2;
                
                i--;
                }
                end --;
                i++;
            }
            else{
                i++;
            }
        }
    }
}