LeetCode ---- 75、颜色分类

题目链接

思路:

此题属于荷兰国旗问题。

准备三个指针zero、cur、two,

zero代表所指向位置数字为0且前面数字均为0,

cur代表当前所指向的数字

two代表所指向位置数字为2且后面数字均为2

以1作为标识符进行partition

初始时,zero指向-1位置,即0位置的前一个位置,cur指向0位置,two指向num.length位置,即最后一个位置的后一个位置

开始从左向右遍历,

若nums[cur] == 0,则将zero向右移动一位,cur位置与zero位置的数进行交换,cur向后移动一位。此处可以移动cur指针,是因为cur与zero交换之后,能够保证cur所指向的是一定为1,所以可以向后进行移动

若nums[cur] == 1,则cur向后移动一位

若nums[cur] == 2,则将two向左移动一位,cur位置与two位置的数进行交换,此时不可以移动cur指针,因为后面two指向的元素并不确定是几,交换完成后,只能保证two指针处数字为2,cur指针位置的数字无法确定

    public void sortColors(int[] nums) {
        if (nums == null || nums.length < 2) {
            return;
        }
        int cur = 0;
        int zero = -1;
        int two = nums.length;
        while (cur < two) {
            // 当前数字为0,与zero指针所指向位置进行交换
            if (nums[cur] == 0) {
                zero++;
                swap(nums, zero, cur);
                cur++;
            // 当前数字为1,则直接跳过
            } else if (nums[cur] == 1) {
                cur++;
            // 当前数字为2,与two指针所指向位置进行交换
            } else {
                two--;
                swap(nums, cur, two);
            }
        }
    }
    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }

代码参考自:https://leetcode-cn.com/problems/sort-colors/solution/kuai-su-pai-xu-partition-guo-cheng-she-ji-xun-huan/

猜你喜欢

转载自blog.csdn.net/sinat_34679453/article/details/106933674
今日推荐