leetcode--75. Sort Colors

Sort Colors


Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.


Example:

Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]
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.


这道题,拿到手第一想法是计数排序,反正就只有三个数,直接定义一个大小为三的数组就ok,这是一个比较简单的思路,也非常容易实现。后来看了一些大牛的算法视频之后,提出了三路快排的思想来解决这个问题,三路快排也就是快排的思想。

首先,定义三个指向,第一个是指向z = 0,第二个是个游标 i,第三个是指向数组的末尾 e = nums.length-1。游标从0开始,遇到元素1的话,就继续向前,遇到元素0的话,和nums[z]交换位置,z向前移动,i也继续向前,遇到2的话,和nums[e]交换位置,e - -,思想是不断把2换到后面,0换到前面,1的位置就让他留在中间。

代码如下:

class Solution {
    public void sortColors(int[] nums) {
        int z = 0;   //指向元素0
        int e = nums.length-1;   //指向元素2
        int i = 0;   // 游标
        while(i <= e){
            if(nums[i] == 1)
                i++;    // 遇到1 直接继续向前
            else if(nums[i] == 0){   //遇到0 交换 位置
                int t = nums[i];
                nums[i] = nums[z];
                nums[z] = t;
                z++;
                i++;   // 关于这里为什么i++,下面解释
            }else{     // 遇到2 交换位置
                int t = nums[i];
                nums[i] = nums[e];
                nums[e] = t;
                e--;    //为什么这里 i 不需要++
            }
        }
    }
}

针对上面的两个问题,首先回答为什么 i++,这里需要注意的是,我们的游标是从前面来的,前面的元素是处理好的,是有序的,不需要再次处理,所以可以继续向前推动,而后面i 为什么不需要++,这里的道理是和前面的相同的情况,后面的元素游标没有处理到,假设,后面的元素是2,被换到了前面,而游标继续向前推动,就乱序了,正确的做法是游标停在当前的位置,继续处理这个被换下来的2,直到有序为止。

我们针对上面的例子进行手推,如果i不++的话,那么我们i将永远处于索引为0的位置,而z不断向前,这样明显是和我们的预期是不符合的,所以,这里必须要进行i++操作。

ok,问题到此结束。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值