前言

 

【LeetCode 题解】系列传送门:  http://www.cnblogs.com/double-win/category/573499.html

 

1.题目描述

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?

2. 题意

 

从题目的意思不难看出,需要将一个随机的颜色序列排序,按照red, white, blue 三种颜色排序。

 

3. 思路

从题目的意思不难看出,需要将一个随机的颜色序列排序,按照red, white, blue 三种颜色排序。
由于输入序列中只有三种固定的颜色,那么最容易想到的办法,就是计数排序,Counting Sort。
 
 1     void sortColors(int A[], int n) {
2 int s0,s1,s2,i;
3 s0=s1=s2=0;
4 for(i=0;i<n;i++)
5 {
6 if(A[i]==0) s0++;
7 else if(A[i]==1) s1++;
8 else s2++;
9 }
10 for(i=0;i<s0;i++) A[i]=0;
11 for(i=s0;i<s0+s1;i++) A[i]=1;
12 for(;i<n;i++) A[i]=2;
13 }

然而,正如Follow up中所表述的一样,计数排序需要两次遍历数组,那么我们能否找到一种只需要遍历一次数组,就能将其排序的方法呢?

 

4: 解法

由于只有三种颜色,那么红色必然在数组的左边,而蓝色必然在数组的右边。

那么我们只需要两个变量记录红色所在区域的边界[0, i], 以及蓝色所在区域的边界[j,n-1]。那么白色所在的区域必然为(i,j).

怎样得到红蓝两色的边界呢?

初始化: 红色边界i=0; 蓝色边界j=n-1;

为了加速运算,可以预处理,分别从左至右,从右至左,找到红蓝边界,缩小搜索范围。见代码line[3,4]

假设当前位置为k

(1) A[k] 为红色, 那么将该元素同红色右边界的后一个数互换。 A[k] ~ A[i++]

(2) A[k] 为蓝色, 那么将该元素同蓝色左边界的前一个数互换。 A[k] ~ A[j--]

(3) A[k] 为白色, 那么当前无需交换, k=k+1;

终止条件 k>j 此时不可能出现白色,可以退出了。

该过程时间复杂度 O(n).

 1     void sortColors(int A[], int n) {
2 int i=0,j=n-1,k;
3 while(A[i]==0) i++;
4 while(A[j]==2) j--;
5
6 k=i;
7 while(k<=j)
8 {
9 if(A[k]==0)
10 {
11 if(A[i]==0)
12 k++;
13 else
14 swap(A[i],A[k]);
15 i++;
16 }
17 else if(A[k]==2)
18 {
19 swap(A[j],A[k]);
20 --j;
21 }
22 else
23 k++;
24 }
25 }

 

作者:Double_Win

出处: http://www.cnblogs.com/double-win/p/3759765.html

声明: 由于本人水平有限,文章在表述和代码方面如有不妥之处,欢迎批评指正~

[LeetCode题解]: Sort Colors的更多相关文章

  1. [Leetcode Week2]Sort Colors

    Sort Colors题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/sort-colors/description/ Description Give ...

  2. 【LeetCode】Sort Colors 数组排序

    题目:Sort color <span style="font-size:18px;">/*LeetCode sort colors 题目:输入一个数组.包括0,1,2 ...

  3. LeetCode 75. Sort Colors (颜色分类):三路快排

    Given an array with n objects colored red, white or blue, sort them in-place so that objects of the ...

  4. 【LeetCode】Sort Colors

    Sort Colors Given an array with n objects colored red, white or blue, sort them so that objects of t ...

  5. LeetCode 75. Sort Colors(排序颜色)

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  6. [LeetCode] 75. Sort Colors 颜色排序

    Given an array with n objects colored red, white or blue, sort them in-place so that objects of the ...

  7. Leetcode 75. Sort Colors

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  8. 【leetcode】Sort Colors(middle)☆

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  9. Java for LeetCode 075 Sort Colors

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

随机推荐

  1. 关于where和having的直观理解

    一,查询区别 where是对前面select的字段没有要求,直接查询库表的 having是对前面的select的字段有要求,字段已经select出来的 可以用having进行处理 select id, ...

  2. 核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程

    KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实 ...

  3. 【CentOS 6.5】 安装VNCServer及配置,注销处理

    如果没有安装VNCServer,只有在机器上登录进桌面后才可以通过VNC连接,否则连不上... 安装: yum install tigervnc-server   运行并设置密码: vncserver ...

  4. Resetting the Root Password Using rd.break for RHEL7

    Start the system and, on the GRUB 2 boot screen, press the e key for edit. Remove the rhgb and quiet ...

  5. Netty使用Google的ProtoBuf

    protobuf是由Google开发的一套对数据结构进行序列化的方法,可用做通信协议,数据存储格式,等等.其特点是不限语言.不限平台.扩展性强 Netty也提供了对Protobuf的天然支持,我们今天 ...

  6. java 控制台 输入字符串

    import java.util.Scanner; //导入输入类 public static void main(String[] args) {      //创建输入对象   Scanner s ...

  7. 跟着太白老师学python day10 函数嵌套, global , nonlocal

    函数嵌套: 第一种嵌套方法 def func(): count = 123 def inner(): print(count) inner() func() 第二种嵌套方法 count = 123 d ...

  8. 查看MSSQL数据库每个表占用的空间大小

    需要查看数据库表的大小,查询SQL Server联机从书得到如下语句: sp_spaceused 显示行数.保留的磁盘空间以及当前数据库中的表所使用的磁盘空间,或显示由整个数据库保留和使用的磁盘空间. ...

  9. SMTPSenderRefused: (530, ‘5.5.1 Authentication Required. Learn more at \n5.5.1

    在跟着<Flask Web开发:基于Python的Web应用开发实战>一书学习时,出现了以上错误提示. 问题出于第11章--博客文章.当运行 python manage.py runser ...

  10. 【bzoj3667】Rabin-Miller算法

    3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1200  Solved: 363[Submit][Statu ...