leetcode-75. 颜色分类

题目这道题目还是比较有意思的

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意:
不能使用代码库中的排序函数来解决这道题。

要求仅使用常数空间的一趟扫描算法

示例

输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
在这里插入图片描述

代码(其实有很多类似的题目,要求在原数组进行修改,一次遍历)

class Solution {
    public void sortColors(int[] nums) {
    //对特殊情况进行判断
    if(nums.length<=1){return ;}
    //定义一个标志位right,从后向前
    int right=nums.length-1;
    //定义一个标志位left,从前往后;
    int left=0;
    //index指向下一个0插入的位置
    int index=0;
    //注意这里一定是等号,例如nums{2,0,1},最后left指向数字0,righr也指向数字0,如果判断条件没有等号,最终排序结果将是1,0,2;
    while(left<=right){
    //如果当前位置left等于0,将left位置的数字与index位置的数字进行交换,
    //前面也说了index始终指向下一个插入0的位置
    //而且要注意一点,这个时候index位置的元素只可能是0或者1,不可能是2
    //注意一点left左侧的元素一定是0和1,且一定有序,不可能存在2
        if(nums[left]==0){
        int temp=nums[index];
        nums[left]=temp;
        nums[index]=0;
        left++;
        index++;
        //如果left位置是2的话,将left位置的元素与right位置的元素进行交换,我们从后往前插入2,right始终指向下一个插入2的位置;
        //交换之后注意,left的位置是不变的,因为left位置交换后可能是0,1或者2,所以left不需要自增,但right需要自减指向下一个插入2的位置
        }else if(nums[left]==2){
         nums[left]=nums[right];
         nums[right]=2;
         right--;
        }else{
        //如果为1的话,left继续向右走
            left++;
        }
    }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值