Given an array with n objects colored red, white or blue, sort them in-place 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.

Example:

Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]

Follow up:

A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.
Could you come up with a one-pass algorithm using only constant space?


Runtime: 0 ms, faster than 100.00% of Java online submissions for Sort Colors.
Memory Usage: 37.3 MB, less than 0.93% of Java online submissions for Sort Colors.

难度:medium

题目:给定一数组表示红,白,蓝三种颜色,原地排序使得相同颜色的物体相邻。

思路:

  1. counting sort
  2. 使用左右置换指针

counting sort

class Solution {
    public void sortColors(int[] nums) {
        int[] colors = {0, 0, 0};
        for (int i = 0; i < nums.length; i++) {
            colors[nums[i]]++;
        }
        for (int i = 0; i < nums.length;) {
            for (int j = 0; j < colors.length; j++) {
                for (int k = 0; k < colors[j]; k++) {
                    nums[i++] = j;
                }
            }
        }
    }
}

左右指针置换

class Solution {
    public void sortColors(int[] nums) {
        int left = 0, right = nums.length - 1;
        for (int i = left; i <= right;) {
            if (2 == nums[i]) {
                swap(nums, i, right--);
            } else {
                i++;
            }
        }
        
        for (int i = right; i >= left;) {
            if (0 == nums[i]) {
                swap(nums, i, left++);
            } else {
                i--;
            }
        }
    }
    
    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}
class Solution {
    public void sortColors(int[] nums) {
        int left = 0, right = nums.length - 1;
        for (int i = left; i >= left && i <= right;) {
            if (1 == nums[i]) {
                i += 1;
                continue;
            }
            if (2 == nums[i]) {
                swap(nums, i, right--);
            } else if (0 == nums[i]) {
                swap(nums, i, left++);
            }
            i = left;
        }
    }
    
    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

linm
1 声望4 粉丝

〜〜〜学习始于模仿,成长得于总结〜〜〜