75. 颜色分类

题目链接:力扣

 解题思路:因为整个nums数组中只有0,1,2三个数组成。对nums升序排序后,0一定都在数组的最左边,2一定都在数组的最右边,1在数组的中间。那么只需要将0移动到数组的左边,2移动到数组的右边,当前1和2全部移动完成后。剩下的1就在数组中间了。所以可以使用两个指针标记已经排序好的0和2。

常用空间的一趟扫描算法如下:

  1. left  = 0:标记下一个0待放入的位置
  2. right = num.length-1:标记下一个2待放入的位置
  3. 从前往后遍历nums数组,直到i>right:
    1. 如果nums[i] == 0:需要将这个0移动到数组的左边
      1. tem = nums[left]
      2. nums[left] = nums[i]
      3. nums[i]  = tem
      4. left++
    2. 如果 nums[i] == 2:需要将这个0移动到数组的右边
      1. tem = nums[right]
      2. nums[right] = nums[i]
      3. nums[i] = tem
      4. right -- 
      5. continue:这里continue,不让 i 进行加1操作,因为交换后 nums[i]这个位置的数组可能为1,这个时候,需要下次循环中继续处理这个数组,将其移动到数组的左边
    3. i ++ 

 AC代码:

class Solution {
    public static void sortColors(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        for (int i = 0; i <= right; ) {
            if (nums[i] == 0) {
                int tem = nums[left];
                nums[left] = nums[i];
                nums[i] = tem;
                left++;
            } else if (nums[i] == 2) {
                int tem = nums[right];
                nums[right] = nums[i];
                nums[i] = tem;
                right--;
                continue;
            }
            i++;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值