颜色分类

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

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

样例

 
注意

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

说明

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

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

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

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

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

  1. class Solution {
  2. //总耗时: 14896 ms
  3.  
  4. /**
  5. * @param nums: A list of integer which is 0, 1 or 2
  6. * @return: nothing
  7. */
  8. public void sortColors(int[] nums) {
  9. int low = 0;
  10. int high = nums.length-1;
  11. //先找到最左的非0和最右的非2
  12. while(nums[low] == 0 && low < high) low++;
  13. while(nums[high] == 2 && low < high) high--;
  14.  
  15. while(nums[low] == 2 || nums[high] == 0 && low < high) {
  16. //如果最左非0是2或者最右非2是0,则将其换至右边或左边
  17. if(nums[low] == 2) {
  18. if(nums[high] == 0) {
  19. nums[low++] = 0;
  20. nums[high--] = 2;
  21. }else {
  22. nums[high--] = 2;
  23. nums[low] = 1;
  24. }
  25. }else {
  26. if(nums[high] == 0) {
  27. nums[low++] = 0;
  28. nums[high] = 1;
  29. }
  30. }
  31. //找到最左的非0和最右的非2
  32. while(nums[low] == 0 && low < high) low++;
  33. while(nums[high] == 2 && low < high) high--;
  34. }
  35.  
  36. for(int i=low+1;i<high && low < high;i++) {
  37. //此时最左非0和最右非2都是1,用i找到0或2,交换到左端或右端
  38. if(nums[i] == 0) {
  39. nums[low++] = 0;
  40. nums[i] = 1;
  41. }else {
  42. if(nums[i] == 2) {
  43. nums[high--] = 2;
  44. nums[i] = 1;
  45. }
  46. }
  47.  
  48. //找到最左的非0和最右的非2
  49. while(nums[low] == 0 && low < high) low++;
  50. while(nums[high] == 2 && low < high) high--;
  51.  
  52. while(nums[low] == 2 || nums[high] == 0 && low < high) {
  53. //如果最左非0是2或者最右非2是0,则将其换至右边或左边
  54. if(nums[low] == 2) {
  55. if(nums[high] == 0) {
  56. nums[low++] = 0;
  57. nums[high--] = 2;
  58. }else {
  59. nums[high--] = 2;
  60. nums[low] = 1;
  61. }
  62. }else {
  63. if(nums[high] == 0) {
  64. nums[low++] = 0;
  65. nums[high] = 1;
  66. }
  67. }
  68. //找到最左的非0和最右的非2
  69. while(nums[low] == 0 && low < high) low++;
  70. while(nums[high] == 2 && low < high) high--;
  71. }
  72. //若此时的low>=i,显然要重新设置i
  73. if(i <= low) i = low+1;
  74. }
  75. //当上面的循环结束时,分类就已完成,只遍历了一次nums,辅助空间为常数
  76. }
  77. }

颜色分类(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. 设置zookeeper开机自启动

    1.进入到/etc/init.d目录下,新建一个zookeeper脚本 cd /etc/init.d vi zookeeper #!/bin/bash #chkconfig:2345 20 90 #d ...

  2. PowerDesigner16 修改表或表的字段Name的时候不让Code不自动跟着变

    在修改表或表的字段Name的时候不让Code不自动跟着变,设置如下: tools-> General   Options-> Dialog 去掉勾选 Name To Code mirror ...

  3. [LA3135]node形式的优先队列

    n个触发器,每个触发器每period秒就产生一个编号为qnum的事件,求前k个事件. n<=1000  k<=10000 node形式的优先队列 主要在于重载小于号,确定优先顺序. #in ...

  4. 【NOIP】提高组2014 解方程

    [题意]已知n次方程(n<=100)及其所有系数(|ai|<=10^10000),求[1,m]中整数解的个数(m<=10^6). [算法]数论 [题解]如果f(x)=0,则有f(x) ...

  5. 【洛谷 P3899】 [湖南集训]谈笑风生 (主席树)

    题目链接 容易发现\(a,b,c\)肯定是在一条直链上的. 定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\)) 分两种情况, 1.\(b\)是\(a\)的祖先,对答案的贡献是 ...

  6. vue_使用npm搭建vue2.0脚手架开发环境

    前言: 在使用vue进行开发时需要搭建vue的运行环境,这里主要是使用淘宝镜像cnpm进行搭建vue的脚手架开发环境.主要是分为mac和window两个版本,两个环境的搭建都是大同小异. mac开发环 ...

  7. servlet线程不安全

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAE9CAIAAABY1Yv/AAAgAElEQVR4nOy9eVxN2/8/viuaU5kqZW

  8. Part2-HttpClient官方教程-Chapter5-流利的API

    5.1. 易于使用的Facade API 使用之前注意引入相应Jar包或者Maven依赖 <dependency> <groupId>org.apache.httpcompon ...

  9. 一个文档让vim飞起来

    原文地址:http://www.cnblogs.com/songfy/p/5635757.html 引言 今天我们特地来讲讲这个vim的配置. vim这东西, 很多人装逼的时候经常会提到, 不过大部分 ...

  10. MACHINE_START与MACHINE_END【转】

    转自:http://blog.csdn.net/cxw3506/article/details/8475965 版权声明:本文为博主原创文章,未经博主允许不得转载. 在移植Linux时,有个结构体需要 ...