LeetCode 75 颜色分类

题目描述

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。

思路

可以使用单个指针扫描两遍或者三指针扫描一遍的方法

思路1 单指针扫描两遍

指针i初始指向数组的第一个元素,指针j初始也指向数组的第一个元素,第一遍用j遍历整个数组,当j指到的数为0时,将其与指针i所指元素交换,同时i加1;第二遍用j从i位置开始遍历,当j指向的数为1时,将其与指针i所指元素交换,同时i加1

思路2 三指针扫描一次

指针p0初始指向数组第一个元素,指针p2指向数组最后一个元素,指针i初始指向数组第一个元素,指针i从前往后遍历直到与p2相遇为止,当i指向元素为0时就和p0所指元素交换,当i指向元素为2时就与p2所指元素交换并且i本次不往后移动,因为从p2交换过来的数还没有进行判断

代码

思路1代码

//单指针扫两遍,第一遍把所有的0交换到数组最左边,第二编把所有的1交换到剩下数组范围的最左边
    public void sortColors(int[] nums) {
        int i = 0, j = 0;
        for (; j < nums.length; j++) {
            if (nums[j] == 0) {
                nums[j] = nums[i];
                nums[i] = 0;
                i++;
            }
        }
        j = i;
        for (; j < nums.length; j++) {
            if (nums[j] == 1) {
                nums[j] = nums[i];
                nums[i] = 1;
                i++;
            }
        }
    }

思路2代码

public void sortColors(int[] nums) {
    int p0 = 0, p2 = nums.length - 1;
    int i = 0;
    while (i <= p2) {
        if (nums[i] == 0) {
            nums[i] = nums[p0];
            nums[p0] = 0;
            p0++;
            i++;
        } else if (nums[i] == 2) {
            nums[i] = nums[p2];
            nums[p2] = 2;
            p2--;
        } else {
            i++;
        }
    }
}
posted @   wutao666  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示