难度:Medium
题目:
给定一个包含红色、白色和蓝色、共
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]
提示:
n == nums.length
1 <= n <= 300
nums[i]
为0
、1
或2
进阶:
- 你能想出一个仅使用常数空间的一趟扫描算法吗?
Related Topics
- 数组
- 双指针
- 排序
重点!!!解题思路
第一步:
明确解题手段:想要一次遍历求解,那么就可以使用双指针来解答
第二步:
这道题的颜色有三种,相当于是分为了3个分区,如果能确定两个分区的位置,
那么最后一个分区不去确定也可以
源码+讲解:
class Solution {
public void sortColors(int[] nums) {
three_partition(nums,0,nums.length-1);
}
public void three_partition(int[] nums,int l,int r){
if (l>=r) return; //边界条件
int x=-1,y=r+1,i=l; //两个指针一个在数组的-1位置,一个在数组最末最+1的位置
while (i<y){
if (nums[i]==1){
i++;
}else if (nums[i]<1){ //x存的是0的值
x++;
swap(nums,x,i);
i++;
}else if (nums[i]>1){ //y存的是2的值 这里i不++是因为,后面换过来的值不知道是大是小,所以不能++
y--;
swap(nums,i,y);
}
}
}
public void swap(int[] nums,int l,int r){
int t=nums[l];
nums[l]=nums[r];
nums[r]=t;
}
}
运行结果:
系列持续更新中,喜欢练习算法的那就点个攒吧