Leetcode 75. Sort Colors

来源:互联网 发布:陕西广电网络宽带套餐 编辑:程序博客网 时间:2024/06/02 03:58

题目

Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.

Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

Note:
You are not suppose to use the library’s sort function for this problem.

思路

排好首尾

代码

package leetcodeArray;public class Leetcode75SortColors {    public void sortColors(int[] nums) {        int second = nums.length - 1, zero = 0;        for(int i = 0; i <= second; ++i){            while(nums[i] == 2 && i < second) swap(nums, i, second--);            while(nums[i] == 0 && i > zero) swap(nums, i, zero++);        }    }    public void swap(int[] array,int x,int y)    {    int temp = array[x];    array[x] = array[y];    array[y] = temp;    }    public static void main(String[] args){        Leetcode75SortColors test = new Leetcode75SortColors();        int[] nums = {0, 1, 1, 2, 2, 2};        test.sortColors(nums);    }}

他山之玉

// two pass O(m+n) spacevoid sortColors(int A[], int n) {    int num0 = 0, num1 = 0, num2 = 0;    for(int i = 0; i < n; i++) {        if (A[i] == 0) ++num0;        else if (A[i] == 1) ++num1;        else if (A[i] == 2) ++num2;    }    for(int i = 0; i < num0; ++i) A[i] = 0;    for(int i = 0; i < num1; ++i) A[num0+i] = 1;    for(int i = 0; i < num2; ++i) A[num0+num1+i] = 2;}// one pass in place solutionvoid sortColors(int A[], int n) {    int n0 = -1, n1 = -1, n2 = -1;    for (int i = 0; i < n; ++i) {        if (A[i] == 0)         {            A[++n2] = 2; A[++n1] = 1; A[++n0] = 0;        }        else if (A[i] == 1)         {            A[++n2] = 2; A[++n1] = 1;        }        else if (A[i] == 2)         {            A[++n2] = 2;        }    }}// one pass in place solutionvoid sortColors(int A[], int n) {    int j = 0, k = n - 1;    for (int i = 0; i <= k; ++i){        if (A[i] == 0 && i != j)            swap(A[i--], A[j++]);        else if (A[i] == 2 && i != k)            swap(A[i--], A[k--]);    }}// one pass in place solutionvoid sortColors(int A[], int n) {    int j = 0, k = n-1;    for (int i=0; i <= k; i++) {        if (A[i] == 0)            swap(A[i], A[j++]);        else if (A[i] == 2)            swap(A[i--], A[k--]);    }}