前言

 

【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. Warning: require(): open_basedir restriction in effect. File(/www/wwwroot/../thinkphp/start.php) is not within the allowed path(s):

    Warning: require(): open_basedir restriction in effect. File(/www/wwwroot//../thinkphp/start.php) is ...

  2. ListBox和ComboBox绑定数据简单例子

    1. 将集合数据绑定到ListBox和ComboBox控件,界面上显示某个属性的内容 //自定义了Person类(有Name,Age,Heigth等属性) List<Person> per ...

  3. Angularjs Ng_repeat中实现复选框选中并显示不同的样式

    最近做了一个选择标签的功能,把一些标签展示给用户,用户选择自己喜欢的标签,就类似我们在购物网站看到的那种过滤标签似的: 简单的效果如图所示: 首先看一下html代码: 1 <!DOCTYPE h ...

  4. Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration

    在Apache的配置文件 httpd.conf 中开启  LoadModule headers_module modules/mod_headers.so  即可解决这个问题.

  5. 使用ControllerClassNameHandlerMapping实现SpringMVC的CoC配置

    使用CoC,惯例优先原则(convention over configuration)的方式来配置SpringMVC可以帮我们声明Controller的时候省下很多功夫. 只要我们的Controlle ...

  6. 软件工程第二次作业(Android Studio利用Junit进行单元测试)

    一.开发工具的安装和运行 1.安装 由于我的电脑之前就安装好了Android Studio,就不再重装了.在这里就给出几条安装过程中需要注意的地方吧: 安装包最好在官网下载已经带有Android SD ...

  7. delete属性

     

  8. SQLSERVER 建立全文检索

    --  创建测试表 --  DROP TABLE FullTextIndexing CREATE TABLE FullTextIndexing ( ID INT IDENTITY(1,1) NOT N ...

  9. Node.js中流程控制

    Node.js中的流程控制可以使用async,在使用之前需要先安装,使用npm安装 npm install async --g 下面主要介绍4种流程控制的方式: 1.串行无关联:async.serie ...

  10. Java-Excel文件读取

    import java.io.File; import java.io.IOException; import org.testng.annotations.DataProvider; import ...