75. Sort Colors

15次阅读

共计 1334 个字符,预计需要花费 4 分钟才能阅读完成。

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
题目:给定一数组表示红,白,蓝三种颜色,原地排序使得相同颜色的物体相邻。
思路:

counting sort
使用左右置换指针

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;
int 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;
}
}

正文完
 0