LeetCode 75. Sort Colors(排序颜色)

在网上,看到一个只需要遍历一遍聪明的做法。

如果只能扫一遍,很容易想到的就是左边存放0和1,右边存放2.两边往中间靠。

设置两个index,left记录第一个1的位置,left左边为0,right记录第一个非2的位置,right右边为2.

然后使用i从头到尾扫一遍,直到与right相遇。

i遇到0就换到左边去,遇到2就换到右边去,遇到1就跳过。

需要注意的是:由于left记录第一个1的位置,因此A[left]与A[i]交换后,A[left]为0,A[i]为1,因此i++;

而right记录第一个非2的位置,可能为0或1,因此A[right]与A[i]交换后,A[right]为2,A[i]为0或1,i不能前进,要后续判断。

由此该数组分为4段:[0,left)-->0; [left,i)-->1; [i,right]-->乱序; (right,n-1]-->2

0  0  0  1  1  1  2  1  0  2  1  2  2  2

           ^         ^             ^

          left         i            right


class Solution {
public:
    void sortColors(int A[], int n) {
        int left = 0;
        int right = n-1;
        int i = 0;
        while(i <= right)
        {
            if(A[i] == 0)
            {
                swap(A[left], A[i]);
                left ++;
                i ++;
            }
            else if(A[i] == 1)
            {
                i ++;
            }    
            else
            {
                swap(A[i], A[right]);
                right --;
            }
        }
    }
};

还有一种我觉得类似,这个也是找三个数最后一个的位置。

class Solution {
public:
    void sortColors(int A[], int n) {
        int i = -1;
        int j = -1;
        int k = -1;
        for(int p = 0; p < n; p ++)
        {
            //根据第i个数字,挪动0~i-1串。
            if(A[p] == 0)
            {
                A[++k] = 2;    //2往后挪
                A[++j] = 1;    //1往后挪
                A[++i] = 0;    //0往后挪
            }
            else if(A[p] == 1)
            {
                A[++k] = 2;
                A[++j] = 1;
            }
            else
                A[++k] = 2;
        }


    }
};

阅读更多
文章标签: LeetCode
个人分类: LeetCode
上一篇LeetCode 74. Search a 2D Matrix
下一篇【已解决】 78. Subsets【39、40未解决】
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭