LeetCode - 75. Sort Colors
2016-07-03 12:47
561 查看
第一种方法是基于计数排序的算法,需要对数组进行两遍的扫描,第一遍统计红,白和蓝的数目,第二遍生成新的数组。这种方法可以进行扩展,对于数组中数字范围已知的情况,都可以使用这种算法。时间复杂度为O(n),代码如下:
public class Solution{
public void sortColors(int[] nums){
int r = 0;
int w = 0;
int b = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] == 0) r++;
else if(nums[i] == 1) w++;
else b++;
}
for(int i = 0; i < nums.length; i++){
if(i < r) nums[i] = 0;
else if(i < r + w) nums[i] = 1;
else nums[i] = 2;
}
}
}
第二种方法并不是很general,特别地对于这道题目适用。这种方法只对数组扫描一次,使用两个指针,分别指向red的最后一个元素和blue最前面的一个元素,i从0到第一个blue index进行扫描,如果遇到了0,那么将nums[i]放在red index的位置,从左侧开始red index++;如果遇到了2,那么将nums[i]放在blue index的位置,从右侧开始,也就是n - blueIndex - 1的位置;如果遇到的是1,那么直接i++。时间复杂度为O(n),代码如下:
public class Solution{
public void swap(int[] nums, int a, int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
public void sortColors(int[] nums){
int n = nums.length;
int r = 0;
int b = 0;
for(int i = 0; i < n - b; i++){
// Red
if(nums[i] == 0){
swap(nums, i, r);
r++;
// Blue
}else if(nums[i] == 2){
swap(nums, i, n - 1 - b);
b++;
i--;
}
}
}
}
知识点:
1. 注意计数排序算法的思想,使用和空间时间复杂度(均为O(n + k))
2. 注意计数排序在k = 3的时候使用两个指针的one-pass方法
public class Solution{
public void sortColors(int[] nums){
int r = 0;
int w = 0;
int b = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] == 0) r++;
else if(nums[i] == 1) w++;
else b++;
}
for(int i = 0; i < nums.length; i++){
if(i < r) nums[i] = 0;
else if(i < r + w) nums[i] = 1;
else nums[i] = 2;
}
}
}
第二种方法并不是很general,特别地对于这道题目适用。这种方法只对数组扫描一次,使用两个指针,分别指向red的最后一个元素和blue最前面的一个元素,i从0到第一个blue index进行扫描,如果遇到了0,那么将nums[i]放在red index的位置,从左侧开始red index++;如果遇到了2,那么将nums[i]放在blue index的位置,从右侧开始,也就是n - blueIndex - 1的位置;如果遇到的是1,那么直接i++。时间复杂度为O(n),代码如下:
public class Solution{
public void swap(int[] nums, int a, int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
public void sortColors(int[] nums){
int n = nums.length;
int r = 0;
int b = 0;
for(int i = 0; i < n - b; i++){
// Red
if(nums[i] == 0){
swap(nums, i, r);
r++;
// Blue
}else if(nums[i] == 2){
swap(nums, i, n - 1 - b);
b++;
i--;
}
}
}
}
知识点:
1. 注意计数排序算法的思想,使用和空间时间复杂度(均为O(n + k))
2. 注意计数排序在k = 3的时候使用两个指针的one-pass方法
相关文章推荐
- 在命令行用 sort 进行排序
- Linux Shell - 如何使用sort与uniq命令删除重复的文本行
- Redis sort 排序命令详解
- 批处理命令教学之字符串排序(sort)
- mysql Sort aborted: Out of sort memory, consider increasing server sort buffer size的解决方法
- C++ 关于STL中sort()对struct排序的方法
- C#中Arraylist的sort函数用法实例分析
- Js中sort()方法的用法
- js采用concat和sort将N个数组拼接起来的方法
- 如何写JS数组sort的比较函数
- javascript中sort()的用法实例分析
- 详解Matlab中 sort 函数用法
- js模拟实现Array的sort方法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- js表数据排序 sort table data
- javascript 数组排序函数sort和reverse使用介绍
- JavaScript Table排序 2.0 (更新)
- js中数组(Array)的排序(sort)注意事项说明
- Javascript数组的排序 sort()方法和reverse()方法
- Java数据结构及算法实例:插入排序 Insertion Sort