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

From Wikipedia, the free encyclopedia
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 解题报告的更多相关文章

  1. 【LeetCode】75. Sort Colors 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 计数排序 双指针 日期 题目地址:https://l ...

  2. 【LeetCode】Sort Colors 解题报告

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

  3. LeetCode: Sort List 解题报告

    Sort List Sort a linked list in O(n log n) time using constant space complexity. 使用Merge Sort, 空间复杂度 ...

  4. 【LeetCode】147. Insertion Sort List 解题报告(Python)

    [LeetCode]147. Insertion Sort List 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: h ...

  5. LeetCode: Combination Sum 解题报告

    Combination Sum Combination Sum Total Accepted: 25850 Total Submissions: 96391 My Submissions Questi ...

  6. 【LeetCode】Permutations 解题报告

    全排列问题.经常使用的排列生成算法有序数法.字典序法.换位法(Johnson(Johnson-Trotter).轮转法以及Shift cursor cursor* (Gao & Wang)法. ...

  7. LeetCode - Course Schedule 解题报告

    以前从来没有写过解题报告,只是看到大肥羊河delta写过不少.最近想把写博客的节奏给带起来,所以就挑一个比较容易的题目练练手. 原题链接 https://leetcode.com/problems/c ...

  8. C#版 - LeetCode 148. Sort List 解题报告(归并排序小结)

    leetcode 148. Sort List 提交网址: https://leetcode.com/problems/sort-list/  Total Accepted: 68702 Total ...

  9. 【LeetCode】148. Sort List 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

随机推荐

  1. 【转】Html.RenderPartial与 Html.RenderAction的区别

    Html.RenderPartial与Html.RenderAction 这个两个方法都是用于把MVC用户控件嵌入到View中. Html.RenderPartial是直接将MVC用户控件嵌入到界面上 ...

  2. Eclipse 如何导入web项目

      Eclipse 如何导入web项目 CreateTime--2018年3月8日09:07:16 Author:Marydon 方法一:推荐使用 1.将web项目手动拷贝到Eclipse的工作空间下 ...

  3. 〖Linux〗使用gsoap搭建web server(C++)

    1. gsoap的好处就不用说了:百度百科 2. gsoap的下载地址:项目地址,目前我使用的是2.8.15版本 3. 开发环境:Ubuntu13.10 4. 具体操作步骤(以简单相加为例): 1)编 ...

  4. 【Java虚拟机】运行时数据区

    Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随 ...

  5. mysql 设置密码

    法一: 格式:mysqladmin -u用户名 -p旧密码 password 新密码 方法二:1.用root 进入mysql后mysql>set password =password('你的密码 ...

  6. document.body、document.documentElement和window获取视窗大小的差别

    来源:http://www.ido321.com/906.html 在w3school关于window对象的介绍中,介绍了获取浏览器窗体大小的三种方法(浏览器的视口,不包含工具栏和滚动栏). 对于In ...

  7. mysql中字符集和排序规则说明

    数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set),每种字符集也有各自的排序规则(Collation). 一.字符集 字符集,即用于定义字符在数据库中的编码的集合. 常见 ...

  8. DP较为完整的知识

    数位DP 这类题,才刚刚接触,记得去年网络赛,就有道这样的题,我完全不会, 对于这类题基本方法是,是利用数的位数来构造转移方程. 下面给出两篇论文的链接: <数位计数问题解法研究> < ...

  9. HawkHost老鹰主机更换主域名方法

    http://www.yd631.com/change-hawkhost-primary-domain/圣诞节优惠期间,很多童鞋们购买了老鹰主机,可能由于大家初次使用海外主机或者是CP面板的空间.购买 ...

  10. C# MediaPlayer的详细用法

    AxWindowsMediaPlayer的详细用法 作者:龙昊雪 AxWindowsMediaPlayer的详细用法收藏 function StorePage(){d=document;t=d.sel ...