zoukankan      html  css  js  c++  java
  • LeetCode OJ 75. Sort Colors

    Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.

    Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

    Note:
    You are not suppose to use the library's sort function for this problem.

    Follow up:
    A rather straight forward solution is a two-pass algorithm using counting sort.
    First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.

    Could you come up with an one-pass algorithm using only constant space?


    【题目分析】

    一个数组中用0,1,2分别代表三种颜色red,white,blue。对这三种颜色排序,使得red在最前面,blue在最后面。最好的办法是一次遍历,使用固定的空间。


    【思路】

    1. 排序法

    这是效率最低的方法,我们要像排序其他数组一样对有三种值(0,1,2)的数组增序排序,时间复杂度在O(n2);

    2. 计数法

    先遍历一遍数组,统计每种颜色的个数m,n,l,然后进行第二次遍历,写入m个0,n个1,l个2;时间复杂度为O(n);

    3. 标记法

    我们设置两个标记,分别记录0的结束位置和2的开始位置,遍历当前数组,如果为1则继续向前,如果为0则把它放到0的结束位置之后,如果为2就把它放到2的开始位置之前。这样经过一遍遍历就可以把不同的颜色分开。举个例子如下:


    【java代码】

     1 public class Solution {
     2     public void sortColors(int[] nums) {
     3         if(nums == null || nums.length == 0) return;
     4         
     5         int lastred = -1;
     6         int firstblue = nums.length;
     7         int i = 0;
     8         
     9         while(i < firstblue){
    10             if(nums[i] == 0){
    11                 if(i == lastred + 1)
    12                     lastred = i++;
    13                 else if(i > lastred + 1){
    14                     nums[++lastred] = 0;
    15                     nums[i++] = 1;
    16                 }
    17             }
    18             else if(nums[i] == 2){
    19                 if(nums[firstblue-1] != 2){
    20                     nums[i] = nums[firstblue-1];
    21                     nums[--firstblue] = 2;
    22                 }
    23                 else firstblue--;
    24             }
    25             else i++;
    26         }
    27     }
    28 }
  • 相关阅读:
    mybatis3.4.3中文文档(.chm文件)
    Castle学习系列之二:Castle配置
    自己写一个jquery
    apply bind call 和 this
    超级无敌海景拽掉咋天的魔方
    小试Dapper
    Linux或Linux虚拟机桥接模式使用Python2认证Drcom
    分治法实现 n皇后问题 Java语言
    分治法实现1-N的数字按字典序全排列组合 Java语言
    Java实现二进制转换16进制(可以去掉空格)
  • 原文地址:https://www.cnblogs.com/liujinhong/p/5544786.html
Copyright © 2011-2022 走看看