[LeetCode题解]: Sort Colors
前言
【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. 思路
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的更多相关文章
- [Leetcode Week2]Sort Colors
Sort Colors题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/sort-colors/description/ Description Give ...
- 【LeetCode】Sort Colors 数组排序
题目:Sort color <span style="font-size:18px;">/*LeetCode sort colors 题目:输入一个数组.包括0,1,2 ...
- LeetCode 75. Sort Colors (颜色分类):三路快排
Given an array with n objects colored red, white or blue, sort them in-place so that objects of the ...
- 【LeetCode】Sort Colors
Sort Colors Given an array with n objects colored red, white or blue, sort them so that objects of t ...
- LeetCode 75. Sort Colors(排序颜色)
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- [LeetCode] 75. Sort Colors 颜色排序
Given an array with n objects colored red, white or blue, sort them in-place so that objects of the ...
- Leetcode 75. Sort Colors
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- 【leetcode】Sort Colors(middle)☆
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- 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 ...
随机推荐
- 关注下Swoole
面向生产环境的 PHP 异步网络通信引擎 使 PHP 开发人员可以编写高性能的异步并发 TCP.UDP.Unix Socket.HTTP,WebSocket 服务.Swoole 可以广泛应用于互联网. ...
- mybatis No enum const class org.apache.ibatis.type.JdbcType.Date 坑爹的配置
转自:https://lihaiming.iteye.com/blog/2248059 在ibatis中不需要关注这些参数 而转到mybatis后 如果字段值为空 必须设置jdbcType如inser ...
- 由于安装Android设备驱动异常,ADB无法识别安卓设备的解决方案
体验更优排版请移步原文:http://blog.kwin.wang/programming/android-driver-exception-solution.html 最近换了台新电脑,在Andro ...
- **类的起源--type
通过type类的实例化,创建新的类. #!/usr/bin/env python # Version = 3.5.2 def func(self): print('Hello,{}'.format(s ...
- HTML 空白
HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- PHP - 闭合标签
最最开始的时候经常遇到这个问题,就是如果一个文件里面全部都是php代码的话,我写了前闭合和后闭合的时候,文件一多就容易报错,老是说什么有关输出的错误,貌似大概就是header已经发了. 手册上面这个样 ...
- Spring3开发(一)
1 Ioc是什么? Ioc:Inversion of Control,控制反转,控制权从应用程序转移到框架(如Ioc容器),是框架的共有特性. 1.1 为什么需要IoC容器?IoC容器是如何演变的? ...
- Spark会产生shuffle的算子
去重 def distinct() def distinct(numPartitions: Int) 聚合 def reduceByKey(func: (V, V) => V, numParti ...
- 实现SwipeRefreshLayout首次进入自动刷新
看到了Android版知乎实现了这种效果,就自己也实现了一下. 先来一张效果图 实现方式: 方法一. ①在onWindowFocusChanged()方法中,设置为刷新状态为true @Overrid ...
- Oracle中针对中文进行排序
在oracle 9i之前,对中文的排序,是默认按2进制编码来进行排序的. 9i时增加了几种新的选择: 按中文拼音进行排序:SCHINESE_PINYIN_M 按中文部首进行排序:SCHINESE_RA ...
