方法1:
借助额外数据结构存储数据
import java.util.*;
public class Solution {
public int[] sortColor(int[] colors) {
int len = colors.length;
// 三个集合,分别保存红白蓝元素(0-1-2)
List<Integer> redList = new ArrayList<>();
List<Integer> whiteList = new ArrayList<>();
List<Integer> blueList = new ArrayList<>();
for (int i = 0; i < len; i++) {
int val = colors[i];
if (val == 0) {
redList.add(val);
} else if (val == 1) {
whiteList.add(val);
} else {
// val == 2
blueList.add(val);
}
}
// 取出三个集合元素,合并成一个集合
int[] resArray = new int[len];
int redSize = redList.size();
int whiteSize = whiteList.size();
int blueSize = blueList.size();
for (int i = 0; i < redSize; i++) {
resArray[i] = redList.get(i);
}
for (int i = 0; i < whiteSize; i++) {
resArray[i + redSize] = whiteList.get(i);
}
for (int i = 0; i < blueSize; i++) {
resArray[i + redSize + whiteSize] = blueList.get(i);
}
return resArray;
}
}
方法2:
双指针法
import java.util.*;
public class Solution {
public int[] sortColor(int[] colors) {
int len = colors.length;
// 左指针遍历;碰到红色元素就和右指针交换,把红色元素放在前面
int left = 0;
int tempRight = left;
while (tempRight < len) {
if (colors[tempRight] == 0) {
swap(colors, left, tempRight);
left++;
}
tempRight++;
}
// 右指针遍历;碰到蓝色元素就和左指针交换,把蓝色元素放在后面
int right = len - 1;
int tempLeft = right;
while (tempLeft >= 0) {
if (colors[tempLeft] == 2) {
swap(colors, right, tempLeft);
right--;
}
tempLeft--;
}
return colors;
}
private void swap(int[] colors, int i, int j) {
int temp = colors[i];
colors[i] = colors[j];
colors[j] = temp;
}
}



京公网安备 11010502036488号