LeetCode: Sort Colors 解题报告
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.
click to show follow up.
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?

Solution 1:
类似radix sort, 先扫描一次得知所有的值出现的次数,再依次setup它们即可
ref: http://blog.csdn.net/fightforyourdream/article/details/15025713
http://en.wikipedia.org/wiki/Radix_sort
Radix sort
| Class | Sorting algorithm |
|---|---|
| Data structure | Array |
| Worst case performance | ![]() |
| Worst case space complexity | ![]() |
In computer science, radix sort is a non-comparative integer sorting algorithm that sorts data with integer keys by grouping keys by the individual digits which share the same significant position and value. A positional notation is required, but because integers can represent strings of characters (e.g., names or dates) and specially formatted floating point numbers, radix sort is not limited to integers. Radix sort dates back as far as 1887 to the work of Herman Hollerith on tabulating machines.[1]
public void sortColors1(int[] A) {
if (A == null || A.length == ) {
return;
}
int len = A.length;
int red = ;
int white = ;
int blue = ;
for (int i = ; i < len; i++) {
if (A[i] == ) {
red++;
} else if (A[i] == ) {
white++;
} else {
blue++;
}
}
for (int i = ; i < len; i++) {
if (red > ) {
A[i] = ;
red--;
} else if (white > ) {
A[i] = ;
white--;
} else {
A[i] = ;
}
}
}
Solution 2:
使用双指针指向左边排好的0和右边排好的1,再加一个指针cur扫描整个数组。一趟排序下来就完成了。相当快捷。
注意:与右边交换之后,cur不能移动,因为你有可能交换过来是1或是0,还需要与左边交换。而与左边交换后,cur就可以向右边移动了。
public void sortColors(int[] A) {
if (A == null || A.length == ) {
return;
}
int len = A.length - ;
int left = ;
int right = len;
int cur = ;
while (cur <= right) {
if (A[cur] == ) {
// 换到右边,换过来的有可能是0,也有可能是1,所以cur要停留
swap(A, cur, right);
right--;
} else if (A[cur] == ) {
// 从左边换过来的只可能是1,所以可以直接cur++
// 因为所有的2全部换到右边去了。
swap(A, cur, left);
left++;
cur++;
} else {
cur++;
}
}
}
public void swap(int[] A, int n1, int n2) {
int tmp = A[n1];
A[n1] = A[n2];
A[n2] = tmp;
}
December 22nd, 2014 redo
补充一个例子如下:
注:非常要注意的是,我们要使用cur <= right作为边界值。因为right 指向的是未判断的值。所以当cur == right时,此值仍然需要继续判断。

public class Solution {
public void sortColors(int[] A) {
if (A == null || A.length == 0) {
return;
}
int left = 0;
// Bug 1: right is wrong.
int right = A.length - 1;
int cur = 0;
// left: the first one which is not 0
// right: the first one which is not 2
// So we should use <= because right may be not dealed with.
while (cur <= right) {
switch (A[cur]) {
case 0:
// Bug 0: Forget to add A.
swap(A, left, cur);
left++;
cur++;
break;
case 1:
cur++;
break;
case 2:
swap(A, cur, right);
right--;
// 这里不cur++的原因是,有可能从右边换过来有0,1还要继续处理
break;
default:
cur++;
break;
}
}
}
public void swap(int[] A, int n1, int n2) {
int tmp = A[n1];
A[n1] = A[n2];
A[n2] = tmp;
}
}
Follow up:
附上写得不错的一个博客:
http://blog.csdn.net/kenden23/article/details/17440519
以及本题的后续: Lintcode: Sort Colors II 解题报告
GitHub:
https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/sort/SortColors.java
LeetCode: Sort Colors 解题报告的更多相关文章
- 【LeetCode】75. Sort Colors 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 计数排序 双指针 日期 题目地址:https://l ...
- 【LeetCode】Sort Colors 解题报告
[题目] Given an array with n objects colored red, white or blue, sort them so that objects of the same ...
- LeetCode: Sort List 解题报告
Sort List Sort a linked list in O(n log n) time using constant space complexity. 使用Merge Sort, 空间复杂度 ...
- 【LeetCode】147. Insertion Sort List 解题报告(Python)
[LeetCode]147. Insertion Sort List 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: h ...
- LeetCode: Combination Sum 解题报告
Combination Sum Combination Sum Total Accepted: 25850 Total Submissions: 96391 My Submissions Questi ...
- 【LeetCode】Permutations 解题报告
全排列问题.经常使用的排列生成算法有序数法.字典序法.换位法(Johnson(Johnson-Trotter).轮转法以及Shift cursor cursor* (Gao & Wang)法. ...
- LeetCode - Course Schedule 解题报告
以前从来没有写过解题报告,只是看到大肥羊河delta写过不少.最近想把写博客的节奏给带起来,所以就挑一个比较容易的题目练练手. 原题链接 https://leetcode.com/problems/c ...
- C#版 - LeetCode 148. Sort List 解题报告(归并排序小结)
leetcode 148. Sort List 提交网址: https://leetcode.com/problems/sort-list/ Total Accepted: 68702 Total ...
- 【LeetCode】148. Sort List 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
随机推荐
- phpCAS library
The phpCAS library provides a simple API for authenticating users against a CAS server. phpCAS is co ...
- 单机多实例MYSQL主从复制
今天有时间写写,不然心坎里总有点不爽.单机多实例一直都是屌丝的处事风格... 实验环境 RHEL6.5 172.24.0.130 3306 172.24.0.130 3307 01.本次采用的MY ...
- Android API之android.provider.ContactsContract.Data
android.provider.ContactsContract.Data Constants for the data table, which contains data points tied ...
- 通过配置Apache实现404页面替换
一.通用情况--修改apache配置.htaccess 一般网站报404原因都是找不到资源,是服务器(以Apache为例)报错,Apache自定义了404输出,我们的目的是使用自定义的404.html ...
- Linux下一个简单守护进程的实现 (Daemon)
在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程).守护进程是脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,脱离终端是为了避免进程 ...
- HDUOJ---1171
http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Java/Othe ...
- HDUOJ----1263水果
水果 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- Linux 通过cron定期执行 php文件(转)
Linux 通过cron定期执行 php文件 补充几点: 1. 要在php文件头加上解释器的路径,通常是 #!/usr/bin/php 2. 授予要执行的php文件执行权限 chmod a+x x ...
- android中完全退出当前应用程序的四种方法
Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何关闭整个Android应用程序呢?本人总结了几种比较简单的实现方 ...
- Android开发学习之浅谈显示Intent和隐式Intent
Intent寻找目标组件的两种方式: 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的. 隐式Intent:通过Intent ...

