75.颜色分类-力扣(LeetCode)

LeetCode地址:颜色分类

目录

题目

解题思路

代码


题目

荷兰国旗问题:现在有若干个红、白、蓝三种颜色的球随机排列成一条直线。现在我们的任务是把这些球按照红、白、蓝排序。

荷兰国旗

简单说就是把许多数,按从小到大排序,一样的数放在一起。如下图:

题目实例一:

题目实例二:

解题思路

 将数组设置两个边界,分别为左边界,右边界。因为将3个不同的数区分需要两个间隔   o(^▽^)o

 但是最开始的时候数组顺序是乱的,所以需要将两个间隔置于两端  |・ω・`)

剩下我们就需要将L线与R线之间的数,排序就好啦   (•̀ᴗ•́)و ̑̑

综上一共需要3个变量,左边界位置为-1,右边界位置为5,指针位置为0

 1.指针位置为0时值是2,应在最右侧,将2换到右边界位置,之后R线左移一位,指针位置不变

 2.指针位置为0时值是0,应在最左侧,将左边界右移一位变为0位置,将指针与左边界交换,交换之后将指针位置右移一位。此时你会有疑问为什么这样做,先往后看     ( ´・・)ノ(._.`)

 3.指针位置为1时值是0,应在最左侧,重复上面的步骤

 4.指针位置为2时值是2,应在最右侧,将2换到右边界位置,之后R线左移一位,指针位置不变

 你以为指针不会走了?,不不不 (∩•̀ω•́)⊃-*⋆

5.指针位置为2时值是1,应在中间位置,不用交换,将指针位置继续右移就好啦

 6.指针位置为3时值是1,应在中间位置,不用交换,将指针位置继续右移

 7.指针位置为4时,就可以停止啦,因为右边界右边的值都是经过变换来的了,不需要指针继续往下走判断啦   ╮(~▽~)╭

代码

public class 颜色分类 {

    // 数组交换
    static void swap(int[] arr, int i, int j) {
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

    public static void sortColors(int[] nums) {
        // 如果数组长度小于 2 ,不用做
        if (nums.length < 2) { 
            return;
        }
        // 左边界
        int Left = -1;
        // 指针 
        int Middle = 0;
        // 右边界 
        int Right = nums.length - 1; 
        while (Middle <= Right) {
            if (nums[Middle] == 0) {
                swap(nums, Middle++, ++Left);
            } else if (nums[Middle] == 1) {
                Middle++;
            } else {
                swap(nums, Middle, Right--);
            }
        }
    }
    // Main方法:
    public static void main(String[] args) {
        int[] nums = new int[]{2, 0, 2, 1, 1, 0};
        sortColors(nums);
        for (int X : nums) {
            System.out.print(X + " ");
        }
    }
}

IDEA运行:

 力扣:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值