您的位置:首页 > 其它

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方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息