颜色分类

给定一个包含红,白,蓝且长度为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. 【51NOD-0】1018 排序

    [算法]排序 #include<cstdio> #include<algorithm> using namespace std; ]; int main() { scanf(& ...

  2. MySQL 表和库删不掉,并且表也打不开,不能导出的情况

    linux上的mysql中,最近遇到表和库删不掉,并且表也打不开,不能导出的情况. 在删除数据库时,出现以下错误: ERROR 1010 (HY000): Error dropping databas ...

  3. input placeholder 兼容问题

    placeholder是html5出的新特性,ie9以下是不兼容的, 那么为了兼容ie9  我们需要对他做处理 //jq的处理方式$(function(){ jQuery('[placeholder] ...

  4. ”未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项

    引用:http://www.cnblogs.com/joey0210/archive/2012/09/29/2708420.html 上一篇文章说到了DLL引用问题,主要是说的程序中如果使用过了反射, ...

  5. spring boot web 入门

    ① 新建一个maven项目. ② pom中parent设为 spring-boot-starter-parent .建议使用最新的 RELEASE 版本.否则可能需要设置 <repositori ...

  6. 【DLL】动态库的创建,隐式加载和显式加载(转)

    原文转自:https://blog.csdn.net/dcrmg/article/details/53437913

  7. 【EverydaySport】健身笔记——静态牵拉

    静态牵拉一般在运动后进行,可以有效的提高肌肉的柔韧性和关节的灵活性,预防和缓解疼痛. 每个动作达到自己活动范围的最大,有牵拉感即说明有效,静态保持至少30秒,切勿震荡,进行2组. 1 大腿前群牵拉 2 ...

  8. 【Python学习笔记】Pandas库之DataFrame

    1 简介 DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表. 或许说它可能有点像matlab的矩阵,但是matlab的矩阵只能放数值型值(当然matla ...

  9. 【Python学习笔记】Coursera之PY4E学习笔记——File

    1.打开文件 使用handle=open(filename,mode)打开文件.这一函数将会返回一个handle(应该翻译为“柄”吧)用来操控文件,参数filename是一个字符串.参数mode是可选 ...

  10. STM32 volatile关键字

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