Sort Colors

直白表述:给定一个数组,元素值只可能是0,1,2构成,其数组的组成随机,即三种元素混杂无序,找到一个算法,只借用固定量的外部空间,在一次遍历后,将数组成为升序。

说白了就是这么个问题。

我们需要的是0要排在前面,2呢就排在后面,1就不动,这样就好了,但是往前排往后排我们一般的都需要移动元素,这就不好了,题目要求一遍遍历,并且空间一定,那就只能交换了,具体怎么交换呢?就需要用到指示位,告诉我们从哪以前都是0,从哪以后都是2,当然夹在中间的就是1了。所以我们就遍历中间的部分,是0就跟前面 的交换,是2就跟后面的交换,1就跳过。

class Solution {
public:
    void sortColors(int A[], int n) {
       int r = 0;
       int j = 0;
       int b = n - 1;
       for(; j <= b;){
           if(A[j] == 0)//red
           swap(A[r++], A[j++]);
           else if(A[j] == 2)//blue
           swap(A[j], A[b--]);
           else ++j;//write
       }
    }
};

这里有一个地方就是swap(A[r++],A[j++]),r++我们好理解,已经是0了,就移动到下一个未知,j为什么也可以++了呢?因为它不是1就是0,是1当然就跳过,是0就也不用处理了,为什么不是2呢?因为是2的话我们肯定之前就把它移到后面去了。

Sort Colors

上一篇:[Unity3d]水果忍者-切水果功能


下一篇:总结 - Agile1001公开课 第三期【北京】敏捷需求捕获By用户故事