题目描述
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
示例 1:
输入: nums = [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
示例 2:
输入: nums = [2,0,1]
输出: [0,1,2]
解题思路1
- 直接sort排序
代码1
var sortColors = function(nums) {
let a = nums.sort((a, b) => a - b);
return a;
}
解题思路2
- 三路排序。
- 设置一个最左侧指针x = -1,一个最右侧指针y = arr.length + 1,中间值mid为1,i = 0
- 如果当前值等于mid,i指针继续往右走
- 如果当前值小于mid,x++,与当前i指针交换数据
- 如果当前值大于mid,y--,与当前i指针交换数据
代码2
var sortColors = function(nums) {
three_partition(nums, 0, nums.length - 1, 1);
return nums;
}
var three_partition = function(arr, l, r, mid) {
if(l >= r) return ;
let x = -1, y = r + 1, i = l;
while(i < y) {
// 相等,i指针右移
if(arr[i] == mid) {
i++;
} else if (arr[i] < mid) {
// 小于mid的话,x指针右移,交换x和i的值
x++;
[arr[x], arr[i]] = [arr[i], arr[x]];
i++;
} else if (arr[i] > mid) {
// 大于mid的话,y指针左移,交换y和i的值
y--;
[arr[y], arr[i]] = [arr[i], arr[y]];
}
}
}