LeetCode - 75. Sort Colors

来源:互联网 发布:cr2怎么转换成jpg mac 编辑:程序博客网 时间:2024/05/21 09:24

第一种方法是基于计数排序的算法,需要对数组进行两遍的扫描,第一遍统计红,白和蓝的数目,第二遍生成新的数组。这种方法可以进行扩展,对于数组中数字范围已知的情况,都可以使用这种算法。时间复杂度为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方法

0 0
原创粉丝点击