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 ...
随机推荐
- RESTFul中的那些事(2)----怎样支持RESTFul的HTTP Patch方法?
我们在调用RESTFul服务的时候,有的时候.第三方的服务会提供支持PATCH 操作的方法,在这样的情况下.我们假设我们以下的这样的方式, 去调用PATCH操作.肯定会返回40X的错误. PATCH ...
- 一段测试try...catch运行时间的代码
public class Test2 { private static int test() { int i=1; try { i=2; ...
- 腾讯云-搭建 WordPress 个人博客
搭建 WordPress 个人博客 准备 LNMP 环境 任务时间:30min ~ 60min LNMP 是 Linux.Nginx.MySQL 和 PHP 的缩写,是 WordPress 博客系统依 ...
- RabbitMQ消息队列(五):Routing 消息路由[转]
上篇文章中,我们构建了一个简单的日志系统.接下来,我们将丰富它:能够使用不同的severity(严重程度)来监听不同等级的log.比如我们希望只有error的log才保存到磁盘上. 1. Bindin ...
- 【ERROR】bash: vim: command not found的解决办法
今天在学习鸟哥的菜的时候,发现自己linux不可以启用vim命令,错误为:bash: vim: command not found. 机器环境:VMWare8+RED HAT Enterprise5 ...
- 两个变量交换的四种方法(Java) 七种方法(JS)
两个变量交换的四种方法(Java) 对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) 1 class TestEV 2 ...
- Python学习笔记015——文件file的常规操作之四(输入重定向)
windows命令提示符(cmd.exe)和Linux Shell(bash等)均可通过">"或”>>“将输出重定向.其中, ">"表示 ...
- bash 基本功能
1 shell概述 shell是一个命令解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序.用户可以用shell启动.挂起.停止甚至是编写一些程序. shell是一个功能强大 ...
- android 搜索自动匹配关键字并且标红
这个效果主要是为了着重表现搜索关键字的 . 1. 单关键字匹配 若只需匹配 搜索 ...
- java连接mysql数据库实例
做游戏客户端多一年多了,在大学学的java的SSH,基本上都忘完了,今天看了一下发现基本的连接数据库的都忘了...太可怕了这遗忘的速度. 所以写了个连接的例子吧..安装好mysql数据库之后新建了两张 ...

