Sort Colors

题目大意:给一个n个元素的数组,由0,1,2三个数组成,要求将这个数组按照从小到大的顺序排列。

直观想法:遍历一遍数组,分别统计0,1,2三个元素的个数,然后根据各个元素的个数将原来的数组进行覆盖。这种方法需要对数组进行两轮遍历,第一轮遍历统计个数,第二轮遍历覆盖原数组。

改进想法:一次遍历即可将原数组排好序。一般来说排序算法都不太会是O(n)时间复杂度的,这道题之所以能做到这一点是因为只有3个元素。方法是:从前往后遍历数组,若遍历到0则将当前遍历到的0与从前往后最先的一个非0的数进行交换,若遍历到2则将当前遍历到的2与从后往前最先的一个非2的数进行交换,若遍历到1则继续往后遍历。对于0和2的情况,需要将当前元素与前面的或者后面的元素进行交换,所以需要用2个变量分别记住一前一后两个下标的位置,并不断进行更新。代码如下:

void sortColors(int* nums, int numsSize) {
    int left=0, right=numsSize-1, zero=0, t;
    while(left<=right) {
        if(nums[left]==0) {
            t = nums[left];
            nums[left] = nums[zero];
	    nums[zero] = t;
	    zero++;
	    left++;
        }
        else if(nums[left]==2) {
            t = nums[left];
	    nums[left] = nums[right];
	    nums[right] = t;
	    right--;
        } else {
            left++;
        }
    }
}
需要注意的是:nums[left]==0 和 nums[left]==2两种情况的处理是不太一样的,在nums[left]==0中有left++,而在nums[left]==2中并没有left++,因为2与后面的数进行交换之后可能把后面的0换到当前位置了,因此该left位置需要在下一轮循环再判定一次,以便换过来的0能够交换到前面去。而nums[left]==0中并不需要考虑这种情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值