【LeetCode 75】颜色分类

题目链接

【题解】


维护一个左边界l和一个右边界r
其中0..l-1都是'0' 而 r+1..n-1都是'2'
我们令i=l;i<=r;
枚举每一个a[i];
①如果a[i]=2.那么把a[i]丢到a[r]的位置上。
同时a[r]上的数字放到a[i]上来。
然后我们令\(i指针不变化\),因为我们不知道从a[r]过来的是0还是1,如果是0的话还得维护一下l的值。
②如果a[i]=0,那么我们把a[i]丢到a[l]的位置上。
同时a[l]上的数字放到了a[i]上来.(然后l++)
同样\(i指针不变化\),因为我们并不知道从a[l]过来的是1还是2(是2的话下一次操作得放到a[r]上去)
③如果a[i]=1,那么这就是它该待的地方,i++.

【代码】

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int l = 0,r = (int)nums.size();r--;
        while (l<=r && nums[l]==0) l++;
        while (l<=r &&nums[r]==2) r--;
        for (int i = l;i <= r;){
            if (nums[i]==2){
                swap(nums[i],nums[r]);
                r--;
            }else
            if (nums[i]==0){
                swap(nums[i],nums[l]);
                l++;                
                i = max(i,l);
            }else i++;
        }
    }
};

猜你喜欢

转载自www.cnblogs.com/AWCXV/p/11914784.html
今日推荐