在这里,我们将使用0,1和2的整数分别表示红色,白色和蓝色。将所有的0,1,2元素进行排序
2017-10-22 17:24
357 查看
给定一个n个对象颜色为红色,白色或蓝色的数组,对其进行排序,使相同颜色的对象相邻,颜色为红色,白色和蓝色。
在这里,我们将使用0,1和2的整数分别表示红色,白色和蓝色。
优化前的思路及代码:
class Solution {
public void sortColors(int[] nums) {
//时间复杂度:O(n)空间复杂度:O(1)
int[] count = {0,0,0};//存放0,1,2三个元素的出现频率
for(int num : nums){
if(num >= 0 && num <= 2)//确保数组中元素的值都为0,1,2
count[num]++;
else
System.out.println("您输入的数组元素有误");
}
int index = 0;//原来数组的下标,重新排序
int j = 0;//数组中的元素
while(j < count.length){
for(int i = 0;i<count[j];i++){
nums[index++] = j;
}
j++;
}
}
}参考三路快排后的思路及代码:
在这里,我们将使用0,1和2的整数分别表示红色,白色和蓝色。
优化前的思路及代码:
class Solution {
public void sortColors(int[] nums) {
//时间复杂度:O(n)空间复杂度:O(1)
int[] count = {0,0,0};//存放0,1,2三个元素的出现频率
for(int num : nums){
if(num >= 0 && num <= 2)//确保数组中元素的值都为0,1,2
count[num]++;
else
System.out.println("您输入的数组元素有误");
}
int index = 0;//原来数组的下标,重新排序
int j = 0;//数组中的元素
while(j < count.length){
for(int i = 0;i<count[j];i++){
nums[index++] = j;
}
j++;
}
}
}参考三路快排后的思路及代码:
class Solution { public void sortColors(int[] nums) { //时间复杂度:O(n)空间复杂度:O(1)[只遍历一遍完成题目的要求] int zero = -1; //nums[0...zero] == 0; int two = nums.length; //nums[two,n-1] == 2; for(int i = 0;i < two;){ if(nums[i]==1) { i++; }else if(nums[i] == 2) { //two--; int temp = nums[i]; nums[i] = nums[--two]; nums[two] = temp; }else { if(nums[i] == 0){ //zero++; int tmp = nums[++zero]; nums[zero] = nums[i]; nums[i] = tmp; i++; }else{ System.out.println("您输入的数组的数据有误!!!"); } } } } }
相关文章推荐
- 那些年我们刷过的算法题(排序)---有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序
- 分别显示用float和double指数记数法所能表示的最大值和最小值 以一个最高有效位为1的二进制数字开始,用有符号右移操作符对其进行右移,直至所有二进制位都被移除为止,每移一位都要使用Integer
- 用3位以内的随机整数填充长度为20的整型数组,然后使用冒泡排序法按升序进行排序,输出排序后的数组元素(每行输出10个元素)。
- 编写一个使用数组类模板Array对数组进行排序、求最大值和求元素和的程序,并采用相关数据进行测试。
- 定义一个100长度的整型数组,使用rand函数生产随机数对每个元素进行赋值,顺序遍历该数组,输出所有值大于50的数
- Go语言:使用sort包对任意类型元素的集合进行排序
- 一个字符数组,里面的字符可能是a-z、A-Z、0-9.现在要求对数组进行排序,要求所有小写字符放在最前面,所有大写字符放在中间,所有数字放在最后,而且各部分内部分别有序。
- 编写一个使用数组类模板Array对数组进行排序、求最大值和求元素和的程序,并采用相关数据进行测试。
- 线性表的顺序表 实现,及应用-----西文排序+前m个元素和后n个元素进行整体互换+构造纯集合+有序表求纯集合+循环有序链表表示两集合的并集
- 编写一个程序,要求用户输入最多10个高尔夫成绩,并将其存储在一个数组中。 程序允许用户提早结束输入,并在一行上显示所有成绩,然后报告平均成绩。 请使用3个数组处理函数来分别进行输入、显示和计算
- 使用指定的比较器对整个 System.Collections.ArrayList 中的元素进行排序。
- Go语言使用sort包对任意类型元素的集合进行排序的方法
- 问题:利用输入输出流重载实现一个整数数组的输入和输出。 要求:输入一个数组大小 及 所有元素的值,排序后输出该数组的所有元素。
- 学会使用map,对map中的元素进行排序
- (***)有两个10个元素的数组,分别为A和B,编程实现相同位置的元素, 如果 B 的元素小于 A 的元素进行数值交换:(使用回调函数实现)
- 设a,b,c三个元素的进栈次序是a,b,c,符号PUSH与POP分别表示对堆栈进行一次进栈操作与一次出栈操作
- 一个字符数组,里面的字符可能是a-z、A-Z、0-9.现在要求对数组进行排序,要求所有小写字符放在最前面,所有大写字符放在中间,所有数字放在最后,而且各部分内部分别有序(创新工场)
- Fileatream表示文件流,它能够打开和关闭文件,并对文件进行单字节的读写操作。 StreamReader和StreamWriter以文本方式对流进行读写操作。建立一个文本文件,分别使用上面两种方
- 有两个10个元素的数组,分别为A和B,编程实现相同位置的元素, 如果 B 的元素小于 A 的元素进行数值交换:(使用回调函数实现)
- 一个字符数组,里面的字符可能是a-z、A-Z、0-9.现在要求对数组进行排序,要求所有小写字符放在最前面,所有大写字符放在中间,所有数字放在最后,而且各部分内部分别有序(创新工场)