颜色分类(LintCode)
颜色分类
给定一个包含红,白,蓝且长度为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)的更多相关文章
- lintcode:颜色分类
颜色分类 给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数 0,1 和 2 分别代表红,白,蓝. 样例 给你数组 ...
- LintCode——颜色分类
颜色分类:给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数 0,1 和 2 分别代表红,白,蓝. 注意事项: 不能 ...
- (转!)利用Keras实现图像分类与颜色分类
2018-07-19 全部谷歌渣翻加略微修改 大家将就的看哈 建议大佬们还是看看原文 点击收获原文 其中用到的示例文件 multi-output-classification 大家可以点击 下载 . ...
- Matplotlib:可视化颜色命名分类和映射颜色分类
Matplotlib中支持的所有颜色分类 映射颜色分类
- LeetCode:颜色分类【75】
LeetCode:颜色分类[75] 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 ...
- LeetCode 75. 颜色分类(Sort Colors) 30
75. 颜色分类 75. Sort Colors 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中, ...
- Java实现 LeetCode 75 颜色分类
75. 颜色分类 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红 ...
- Java for LintCode 颜色分类
给定一个包含红,白,蓝且长度为n的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数0,1和2分别代表红,白,蓝. 解题思路: Java for Leet ...
- 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 ...
随机推荐
- sql生成一个日期表
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Auth ...
- 51Nod 1347 旋转字符串 | 规律
Input示例 aa ab Output示例 YES NO 规律:abcabc 只需判断原始字符串 #include <bits/stdc++.h> using namespace std ...
- 长ping域名带时间戳
ping www.baidu.com |awk '{print $0 "\t" strftime("%Y:%m:%d-%H:%M:%S",systime())} ...
- 【Codeforces549F】Yura and Developers [单调栈][二分]
Yura and Developers Time Limit: 20 Sec Memory Limit: 512 MB Description Input Output Sample Input 4 ...
- js_返回上一页(兼容苹果手机)
返回上一页功能是常见的功能. 常用的有以下三种代码: window.history.go(-1); //返回上一页 window.history.back(); //返回上一页 //如果要强行刷新的话 ...
- recycleView实现item点击更改该item颜色,其它item颜色变回
项目中需要横向滚动效果,按照以前的思路,我会写一个ScrollView,里边加一个LinearLayout,在代码中动态加入控件,然后动态删除或者改变颜色,现在android有了新控件Recycler ...
- adb端口被占用解决
解决ADB端口占用问题 方式一5037为adb默认端口,若5037端口被占用,查看占用端口的进程PIDC:\Users\wwx229495>netstat -aon|findstr 5037 ...
- Python3 面向对象编程
小案例: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:Bert import sys class Role(object): n=&qu ...
- win10远程桌面配置
Win10连接远程桌面的时候提示您的凭证不工作该怎么办? http://www.cnblogs.com/zhuimengle/p/6048128.html 二.服务器端 1.依旧进入组策略,不过是在服 ...
- device tree --- #interrupt-cells property
device tree source Example1 interrupt-controller@e000e100 { ... ... #interrupt-cells = <0x1>; ...