🌕 🌗 75. 颜色分类

吞佛童子2022年10月10日
  • algorithm
  • array
  • 指针
大约 1 分钟

🌕 🌗 75. 颜色分类

难度: 🌕 🌗

问题描述

img_20.png


解法 1 - 2 遍遍历

class Solution {
    public void sortColors(int[] nums) {
        // 思路:
        // 2 遍扫描,第一次 将 0 移到所有的 1 & 2 前面
        // 第二次 将 1 移到 2 的前面
        int len = nums.length;
        int left = 0;
        int right = len - 1;
        while(left < right) {
            while(left < right && nums[left] == 0) {
                left ++;
            }
            while(left < right && nums[right] > 0) {
                right --;
            }
            swap(nums, left, right);
            left ++;
            right --;
        }
        left = 0;
        right = len - 1;
        while(left < right) {
            if(nums[left] == 0) {
                left ++;
            } else {
                break;
            }
        }
        // [left] != 0
        while(left < right) {
            while(left < right && nums[left] == 1) {
                left ++;
            }
            while(left < right && nums[right] == 2) {
                right --;
            }
            swap(nums, left, right);
            left ++;
            right --;
        }
    }

    private void swap(int[] nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }
}

输出 1

img_19.png


解法 2 - 三指针

class Solution {
    public void sortColors(int[] nums) {
        // 思路:
        // 一遍遍历 - 3 个指针
        // 一个指针 zero 记录 0 截止
        // 一个指针 left 记录 当前 
        // 一个指针 right 记录 右边界 
        // 当遇到 [0, 1] 时,与 zero & left 有关
        // 当遇到 [0, 2] 时,与 zero & right 有关
        // 当遇到 [1, 2] 时,与 left & right 有关
        int len = nums.length;
        int zero = -1;
        int left = 0;
        int right = len - 1;
        while(left <= right) {
            if(nums[left] > nums[right]) {
                swap(nums, left, right);
            }
            // [left] <= [right]
            if(nums[left] == 0) {
                // 判断 zero 后面是否还有 1 可以与 [left] 交换
                if(zero < left - 1) {
                    swap(nums, zero + 1, left);
                }
                zero ++;
                left ++;
            } else if(nums[left] == 1) {
                left ++;
            }else if (nums[left] == 2) {
                right --;
            }
        }
    }

    private void swap(int[] nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }    
}

输出 2

img_21.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou