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 }
  • 相关阅读:
    PHP str_replace() 函数
    PHP str_pad() 函数
    查看带有A-TIME的执行计划
    B. Recursive Queries 打表
    [AHOI2013]作业 莫队 树状数组
    SP1487 PT07J
    SP10628 COT
    洛谷P1494 [国家集训队]小Z的袜子
    [SDOI2013]森林 主席树 启发式合并
    [CQOI2015]任务查询系统 主席树_差分
  • 原文地址:https://www.cnblogs.com/liujinhong/p/5544786.html
Copyright © 2011-2022 走看看