力扣刷题:颜色分类(java实现)

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

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

示例 1:

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例 2:

输入:nums = [2,0,1]
输出:[0,1,2]

示例 3:

输入:nums = [0]
输出:[0]

示例 4:

输入:nums = [1]
输出:[1]

提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i] 为 0、1 或 2

进阶:

你可以不使用代码库中的排序函数来解决这道题吗? 你能想出一个仅使用常数空间的一趟扫描算法吗?

相关标签:数组双指针排序

解析:看完题目后,最简单的思路就是定义一个指针,记录数组开头0的个数,然后遍历数组,将0移到数组开头,当所有的0都放到数组前面后,然后再把1移到0后面,接下来看代码:

public void sortColors(int[] nums) {
        //先把0找出来
        int zero = 0;
        for (int i = 0; i < nums.length; i++) {
            //如果当前位置是0但是zero不是当前位置的索引,交换位置
            if(zero!=i && nums[i]==0){
                int temp = 0;
                temp = nums[zero];
                nums[zero] = nums[i];
                nums[i] = temp;
                zero++;
            }else if(nums[i]==0){//如果当前位置是0并且zero是当前位置的索引,不需要交换位置
                zero++;
            }
        }
        //找出1
        int one = 0;
        for (int i = zero; i < nums.length; i++) {
            //如果当前位置是1但是one不是当前位置的索引,交换位置
            if(one+zero!=i&&nums[i]==1){
                int temp = nums[zero+one];
                nums[zero+one] = nums[i];
                nums[i] = temp;
                one++;
            }else if(nums[i]==1){
            //如果当前位置是1并且one是当前位置的索引,不需要交换位置
                one++;
            }
        }
    }

上诉解法用了两次for循环,分别把0和1移到数组前面,更简单的做法是一次for循环的时候,如果是0,就移到数组开头,如果是2,就移到数组结尾,来看看代码:

public void sortColors(int[] nums) {
        //左右指针
        int left=0,right=nums.length-1;
        for (int i = 0; i <= right; i++) {
            //如果当前元素是0的情况
            //当前元素是0,但是索引不是left,这时需要换位置
            if(nums[i]==0&&i!=left){
                int temp = nums[i];
                nums[i] = nums[left];
                nums[left] = temp;
                left++;
            }else if(nums[i]==0){
                //当前元素是0并且left是当前位置索引,不需要换位置
                left++;
            }
            //如果当前元素是2
            //当前元素是2,并且索引为right的位置刚好也是2,这时指针移位
            if(nums[i]==2&&nums[right]==2){
                right--;
                i--;//这是因为i位置的元素还需要判断是不是0
            }else if(nums[i]==2){
                //当前元素是2,right索引处不是2,直接换位
                int temp = nums[i];
                nums[i] = nums[right];
                nums[right] = temp;
                right--;
                i--;
            }
        }
    }

当你停下来休息的时候
不要忘记
别人还在奔跑

你可能感兴趣的:(力扣刷题:颜色分类(java实现))