码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 75 颜色分类

时间:2020-10-07 21:06:11      阅读:23      评论:0      收藏:0      [点我收藏+]

标签:内存   解决   while   位置   执行   ret   ==   return   java   

LeetCode 75 颜色分类

问题描述:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:

  • 不能使用代码库中的排序函数来解决这道题。

三指针

  • lastRed指向左侧连续的0中最后一个0的位置
  • firstBlue指向右侧连续的2中第一个2的位置
  • curr从lastRed+1开始遍历每个元素,并将0,2添加到左右两侧

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:37.4 MB, 在所有 Java 提交中击败了46.38%的用户

class Solution {
    public void sortColors(int[] nums) {
        if(nums==null || nums.length==0) {
            return;
        }
        //三指针
        int lastRed = -1, firstBlue = nums.length;
        while(lastRed<firstBlue-1 && nums[lastRed+1]==0) {
            lastRed++;
        }
        while(firstBlue>lastRed+1 && nums[firstBlue-1]==2) {
            firstBlue--;
        }
        int curr = lastRed+1;
        while(lastRed<firstBlue && curr<firstBlue) {
            if(nums[curr]==0) {
                //交换lastRed+1与curr
                swap(nums, lastRed+1, curr);
                lastRed++;
            }
            if(nums[curr]==2) {
                //交换firstBlue-1与curr
                swap(nums, firstBlue-1, curr);
                firstBlue--;
            }
            if(curr==lastRed || curr==firstBlue || nums[curr]==1) {
                curr++;
            }
        }
        return;
    }

    public void swap(int[] nums, int idx1, int idx2) {
        if(nums==null || nums.length==0 || idx1<0 || idx1>=nums.length || idx2<0 || idx2>=nums.length) {
            return;
        }
        //交换idx1、idx2
        int tmp = nums[idx1];
        nums[idx1] = nums[idx2];
        nums[idx2] = tmp;
        return;
    }
}

LeetCode 75 颜色分类

标签:内存   解决   while   位置   执行   ret   ==   return   java   

原文地址:https://www.cnblogs.com/CodeSPA/p/13776511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!