leetcode 力扣 75 颜色分类

78 阅读1分钟

三路快排
设置三个指针

  • i为工作指针,负责for循环遍历数组
  • zero指示可以插入0的位置
  • two指示可以插入2的位置

一开始将zero放在最左端,因为0要放在左边,将two放在最右端,因为2要放在右边。02都移动到位了,剩下的1自然在中间了

lc75_ 1.jpeg

lc75_2.jpeg

lc75_3.jpeg

public void sortColors(int[] nums) {
        int zero = 0, two = nums.length - 1;

        for (int i = 0; i <= two; i++) {
            while (nums[i] == 2 && i <= two) {
                swap(nums, i, two);
                two--;
            }

            if (nums[i] == 0) {
                swap(nums, i, zero);
                zero++;
            }
        }
    }

    void swap(int[] nums, int idx1, int idx2) {
        int temp = nums[idx1];
        nums[idx1] = nums[idx2];
        nums[idx2] = temp;
    }

注意for (int i = 0; i <= two; i++)i <= two而不能i < two,因为将左边的2换到右边之后,two指针向左移后,下一个可能会指向0i < two使i指针不能移动到0

注意while (nums[i] == 2 && i <= two)的原因是如果两个2发生交换,while循环就会继续下去直到把2换到右边去,而if (nums[i] == 0)不需要while是因为0本来就应该呆在左边

将移动0放在移动2的后面的原因是,交换2后可能会带来一个0