算法题 颜色分类 一趟遍历Java解法

本篇博客探讨了一种使用Java实现的颜色分类算法,该算法基于三路快速排序的思想,通过一趟遍历完成0、1、2三种颜色元素的正确排序。核心在于设置三个指针,并以1为基准值(PIVOT),将小于1的元素移动到左侧,大于1的移动到右侧,从而达到排序目的。算法的时间复杂度为O(N)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源于LeetCode。

最简单的方法是两趟的,但是如果要求一趟完成,那么这道题的解法是和三路快速排序的做法是一模一样的。

在三路快速排序中,我们维护三个指针left, i, right使得对于数组nums的区间[START...END]满足:

nums[START, left) < PIVOT
nums[left, i) == PIVOT
nums(right, RIGHT] > PIVOT

初始时i = left = START,right = RIGHT

在这道题里面,我们的PIVOT是1,把所有比PIVOT小的(0)放在PIVOT的左边,所有比PIVOT大的(2)放在PIVOT的右边。代码很简洁,如下:

class Solution {
    public void sortColors(int[] nums) {
        int left = 0, right = nums.length - 1;
        // nums[0, left) == 0
        // nums[left, i) == 1
        // nums(right, n - 1] == 2
        int i = 0;
        while (i <= right) {
            if (nums[i] == 0) swap(nums, i++, left++); // nums[left] now is 0, nums[i] now is 1, move i
            else if (nums[i] == 2) swap(nums, i, right--); // nums[right] now is 2, next loop we still check nums[i]
            else i++;
        }
    }
    
    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp;
    }
}

上述解法的时间复杂度是O(N),因为可以注意到每次循环后区间[i, right)的长度(即未知元素的个数)都会减小1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值