lintcode:颜色分类
2016-03-18 17:40
183 查看
颜色分类
给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。我们可以使用整数 0,1 和 2 分别代表红,白,蓝。
样例
给你数组
[1, 0, 1, 2], 需要将该数组原地排序为
[0, 1, 1, 2]
解题
暴力:两次快排 、扫描数组,记录0 1 2 的个数,更新数组
下面是一次快排 + 线性查找
对于数组 A,两个指针 low high
low指向 0的都跳过,结束的时候指向: 1或 2
high指向2的都跳过,结束的时候指向 :0 或 1
当是(1 ,0)时候,交换 low++ 使得0归位
当是(2,0)时候,交换high-- 使得 2归位
当是(2,1)时候,交换high-- 是的2归位
当时(1,1)时候,就比较复杂了
先左找,找到第一个0 和左1互换 low++
找不到0的时候从右1开始右找,找到第一个2的时候,和右1互换 high--
当左找不到2的时候,说明low high之间全是 1 结束
时间复杂度O(N)
class Solution { /** * @param nums: A list of integer which is 0, 1 or 2 * @return: nothing */ public void sortColors(int[] A) { // write your code here if(A == null) return; int len = A.length; int low = 0; int high = len - 1; while(low < high){ while(low <= high && A[low] == 0) low++; while(low <= high && A[high] ==2) high--; if(low < high ){ if(A[low] == 1 && A[high] ==0){ A[low] = 0; A[high] = 1; low++; }else if(A[low]==2 && A[high] ==0){ A[low] =0; A[high] =2; low++; high--; }else if(A[low]==2 && A[high] ==1){ A[low] =1; A[high] =2; high--; }else if(A[low] == A[high] && A[low] == 1){ // 左开始找0 int tmp0 = low + 1; while(tmp0 <= high && A[tmp0] != 0) tmp0++; // 找到了 0 和左1交换 if(tmp0 <= high && A[tmp0]==0){ A[low] = 0; A[tmp0] = 1; low++; }else { //没找到 0 // 右开始找2 int tmp2 = high - 1; while(tmp2 >= low && A[tmp2] != 2) tmp2--; // 找到 2 和右 1 交换 if(tmp2 >=low && A[tmp2] == 2){ A[high] = 2; A[tmp2] = 1; high--; }else{//没找到 0 也没找到 2 说明全是 1 结束 return; } } } } } } }
相关文章推荐
- HTML的头部标签/ HTML5 head meta
- Problem - 2111 Saving HDU
- 手机端用背景图片变模糊
- JSTL 核心标签库 使用
- json与javaBean的序列化与反序列化(待续...)
- 整理:深度学习 vs 机器学习 vs 模式识别
- Android和Linux动态加载机制
- 生日礼物
- C++虚继承(六) --- 虚继承浅析
- 在Ubuntu中安装uwsgi(在python3.5环境下)
- 代码触发clistctrl控件的NM_CLICK事件
- HDOJ 2111 Saving HDU
- [IMX6Q][Android5.1]androidboot.xxx如何转换成ro.boot.xxx
- Python程序在Eclipse控制台中乱码解决方法
- 分布式消息系统:Kafka
- 多语言values文件夹创建
- entityframework.extended 配置mysql
- 实例对象与类对象的简单区别
- mysql 5.6版本免验证密码方式登陆
- js 获取随机字符串