颜色分类

给定一个包含红,白,蓝且长度为n的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。

我们可以使用整数0,1和2分别代表红,白,蓝。

样例

 
注意

不能使用代码库中的排序函数来解决这个问题

说明

一个相当直接的解决方案是使用计数排序扫描2遍的算法。

首先,迭代数组计算0,1,2出现的次数,然后依次用0,1,2出现的次数去覆盖数组。

你否能想出一个仅使用常数级额外空间复杂度且只扫描遍历一遍数组的算法?

代码写的乱糟糟的,难得写了注释。

想法就是把0交换至左边,2交换至右边。

 class Solution {
//总耗时: 14896 ms /**
* @param nums: A list of integer which is 0, 1 or 2
* @return: nothing
*/
public void sortColors(int[] nums) {
int low = 0;
int high = nums.length-1;
//先找到最左的非0和最右的非2
while(nums[low] == 0 && low < high) low++;
while(nums[high] == 2 && low < high) high--; while(nums[low] == 2 || nums[high] == 0 && low < high) {
//如果最左非0是2或者最右非2是0,则将其换至右边或左边
if(nums[low] == 2) {
if(nums[high] == 0) {
nums[low++] = 0;
nums[high--] = 2;
}else {
nums[high--] = 2;
nums[low] = 1;
}
}else {
if(nums[high] == 0) {
nums[low++] = 0;
nums[high] = 1;
}
}
//找到最左的非0和最右的非2
while(nums[low] == 0 && low < high) low++;
while(nums[high] == 2 && low < high) high--;
} for(int i=low+1;i<high && low < high;i++) {
//此时最左非0和最右非2都是1,用i找到0或2,交换到左端或右端
if(nums[i] == 0) {
nums[low++] = 0;
nums[i] = 1;
}else {
if(nums[i] == 2) {
nums[high--] = 2;
nums[i] = 1;
}
} //找到最左的非0和最右的非2
while(nums[low] == 0 && low < high) low++;
while(nums[high] == 2 && low < high) high--; while(nums[low] == 2 || nums[high] == 0 && low < high) {
//如果最左非0是2或者最右非2是0,则将其换至右边或左边
if(nums[low] == 2) {
if(nums[high] == 0) {
nums[low++] = 0;
nums[high--] = 2;
}else {
nums[high--] = 2;
nums[low] = 1;
}
}else {
if(nums[high] == 0) {
nums[low++] = 0;
nums[high] = 1;
}
}
//找到最左的非0和最右的非2
while(nums[low] == 0 && low < high) low++;
while(nums[high] == 2 && low < high) high--;
}
//若此时的low>=i,显然要重新设置i
if(i <= low) i = low+1;
}
//当上面的循环结束时,分类就已完成,只遍历了一次nums,辅助空间为常数
}
}

颜色分类(LintCode)的更多相关文章

  1. lintcode:颜色分类

    颜色分类 给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数 0,1 和 2 分别代表红,白,蓝. 样例 给你数组  ...

  2. LintCode——颜色分类

    颜色分类:给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数 0,1 和 2 分别代表红,白,蓝. 注意事项: 不能 ...

  3. (转!)利用Keras实现图像分类与颜色分类

    2018-07-19 全部谷歌渣翻加略微修改 大家将就的看哈 建议大佬们还是看看原文 点击收获原文 其中用到的示例文件 multi-output-classification 大家可以点击 下载 . ...

  4. Matplotlib:可视化颜色命名分类和映射颜色分类

    Matplotlib中支持的所有颜色分类 映射颜色分类

  5. LeetCode:颜色分类【75】

    LeetCode:颜色分类[75] 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 ...

  6. LeetCode 75. 颜色分类(Sort Colors) 30

    75. 颜色分类 75. Sort Colors 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中, ...

  7. Java实现 LeetCode 75 颜色分类

    75. 颜色分类 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红 ...

  8. Java for LintCode 颜色分类

    给定一个包含红,白,蓝且长度为n的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数0,1和2分别代表红,白,蓝. 解题思路: Java for Leet ...

  9. JAVA swing中JPanel如何实现分组框的效果以及设置边框颜色 分类: Java Game 2014-08-16 12:21 198人阅读 评论(0) 收藏

    代码如下: import java.awt.FlowLayout; import java.awt.Frame; import java.awt.GridLayout; import javax.sw ...

随机推荐

  1. jquery 条形码 插件jquery-barcode使用

    转载文章   jquery 条形码 插件jquery-barcode使用 条码官网: http://barcode-coder.com/en/barcode-jquery-plugin-201.htm ...

  2. POJ 3255 Roadblocks (次短路模板)

    Roadblocks http://poj.org/problem?id=3255 Time Limit: 2000MS   Memory Limit: 65536K       Descriptio ...

  3. MyBatis框架的使用及源码分析(七) MapperProxy,MapperProxyFactory

    从上文<MyBatis框架中Mapper映射配置的使用及原理解析(六) MapperRegistry> 中我们知道DefaultSqlSession的getMapper方法,最后是通过Ma ...

  4. noip2012~2015刷题小记录

    2012d1t1 密码 模拟题 #include<cstdio> #include<cstdlib> #include<cstring> #include<c ...

  5. SSH ERROR: Too many Authentication Failures

    来自: How to recover from "Too many Authentication Failures for user root" 其中一种可以解决的方式 eval ...

  6. Centos服务器ssh免密登录以及搭建私有git服务器

    一.概述 服务器的免密登录和git服务器的搭建,关键都是要学会把自己用的机器的公钥添加到服务器上,让服务器“认识”你的电脑,从而不需要输入密码就可以远程登录服务器上的用户 免密登录当然是登录root用 ...

  7. html+js+node实现五子棋线上对战,五子棋最简易算法

    首先附上我的github地址,https://github.com/jiangzhenfei/five,线上实例:http://47.93.103.19:5900/client/ 线上实例,你可以随意 ...

  8. STM32 volatile关键字

    为了提供对特殊地址的稳定访问. [C] 纯文本查看 复制代码 ? 1 2 3 int i=10; int j=i;     //1 int k=i;    //2 此时编译器对上面代码进行优化,因为在 ...

  9. Linux 入门记录:二、Linux 文件系统基本结构

    一.树状目录结构 Linux 文件系统是一个倒置的单根树状结构.文件系统的根为"/":文件名严格区分大小写:路径使用"/"分割(Windows 中使用" ...

  10. 机器学习开源项目精选TOP30

    本文共图文结合,建议阅读5分钟. 本文为大家带来了30个广受好评的机器学习开源项目. 640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1 最近,Mybridge发布了 ...