LeetCode-75 颜色分类

本文针对LeetCode-75颜色分类问题提供了一种解决方案,通过使用两个指针left和right来实现一趟扫描排序,使得0、1、2三种数字按顺序排列。这种方法避免了常规排序算法的使用,提高了效率。

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

LeetCode-75 颜色分类

题目链接:LeetCode-75
LeetCode-75
题目大意:数组中包含0,1,2三种数字 将数组排序 不能用Arrays.sort()排序进行

解题思路:普通的排序就可以解决 但是这样做就浪费了这道题 我的思路是使用两个坐标left 和right 意义是当前处理的坐标 和处理完的“2”序列最前面的坐标 left从0开始 遇到1就保持现状不变并把left向右移动一位(保证了0在最前面) 遇到2就将left和right-1位置上的数字换一下 (保证了2在最后面)这样就有一个问题 1如何处理 我们可以将1全部变为0 并将1出现的次数记录下来 因为循环结束的条件是两个坐标指向同一个区域 而这个区域恰好是排好的2的第一位 所以前面的一定就会是1 最后我们将改掉的0再改回1即可

我不是很清楚这样的作法算不算仅使用常数空间的一趟扫描算法
另外看LeetCode的解题这道题还有新的知识点没有挖掘

代码块:

class Solution {
    public void sortColors(int[] nums) {
        int left = 0, right = nums.length;
        int sum1 = 0;
        while(left!=right){
            if(nums[left] == 0){
                left++;
                continue;
            }
            if(nums[left] == 1){
                nums[left] = 0;
                sum1++;
                left++;
                continue;
            }
            if(nums[left] == 2){
                //如果是2 则与右指针的数字替换 右指针始终指向排好的2的最前一位
                int t = nums[left];
                nums[left] = nums[right-1];
                nums[right-1] = t;
                right--;
            }
        }
        while(sum1 != 0){
            nums[--right] = 1;
            sum1--;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值