98、技巧-颜色分类

思路

这道题的思路是什么,首先典型荷兰国旗问题:

该问题的关键在于我们要将所有的0放到数组的前部,所有的1放在中间,所有的2放在后部。这可以通过使用两个指针,一个指向数组开头的“0”的最后一个位置,另一个指向数组结尾的“2”的第一个位置,以及一个用来遍历数组的当前指针来实现。

  1. low指针:在数组的开始位置,它的前面(不包括low自身)是排好的0。
  2. high指针:在数组的结束位置,它的后面(不包括high自身)是排好的2。
  3. current指针:用来遍历数组,探索未知的部分。

遍历过程中:

  • 如果遇到0,则将其与low指针指向的位置交换,然后移动low指针和current指针。
  • 如果遇到1,则不做交换,只移动current指针。
  • 如果遇到2,则将其与high指针指向的位置交换,然后仅移动high指针。

由于我们始终将2换到数组的尾部,这意味着交换到前面的元素(未经current检查的元素)需要再次检查,因此当current <= high时,继续遍历。

代码如下:

public void sortColors(int[] nums) {
    int low = 0, high = nums.length - 1, current = 0;
    int temp;
    
    while (current <= high) {
        switch (nums[current]) {
            case 0:
                // 交换当前元素和low指向的元素
                temp = nums[current];
                nums[current] = nums[low];
                nums[low] = temp;
                low++;
                current++;
                break;
            case 1:
                // 不做交换,只移动current
                current++;
                break;
            case 2:
                // 交换当前元素和high指向的元素
                temp = nums[current];
                nums[current] = nums[high];
                nums[high] = temp;
                high--;
                break;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值