75. 颜色分类
给定一个包含红色、白色和蓝色、共 n个元素的数组 nums ,**原地**对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
分析题目
题目要求:
1.原地排序,所以空间应该是O(1)
2.不使用sort函数
正巧昨天写到的HOT100题打卡第29天------技巧解法3中用到了快速排序和解这题的思想比较类似
所以我们就用快速排序算法来写一写这道题
代码
java
class Solution {
public void sortColors(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
//先对整个数组进行一轮排序,划分出左右两个分区
quickSort(nums, 0, nums.length - 1);
}
//快速排序算法
private void quickSort(int[] nums, int left, int right) {
if (left >= right || left < 0 || right < 0) {
return;
}
//先定义出一个基准值,把数组中间位置的数作为基准值
int midIndex = left + (right - left) / 2;
int mid = nums[midIndex];
//另外定义两个指针,避免改变原有的值,每次循环都会重新定位指针
int l = left;
int r = right;
while (l <= r) {
//从左开始找出第一个大于基准值的数,找不到左指针就一直往后移
while (nums[l] < mid && l <= r) {
l++;
}
//从右开始找出第一个小于基准值的数,找不到右指针就一直往前移
while (nums[r] > mid && l <= r) {
r--;
}
//找到之后就交换两个指针所在位置上的两个数,使得基准值前面的数都小于它,后面的数都大于它
if (l <= r) {
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
//交换后左右指针分别移动一次
l++;
r--;
}
}
//第一次调用方法把数组分成了两个分区,后续只需要分别递归排序两个分区即可
quickSort(nums, left, r);
quickSort(nums, l, right);
}
}
具体分析已经在代码中说明了,那今天这道题就先写到这里吧,我们明天见!