题目地址:https://leetcode-cn.com/problems/sort-colors/
题目描述:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
解题思路:
因为三个颜色的球用0、1、2来标识,按输出0全部排在前面,2全部排在后面,初始化定义两个下标位置min=0,指向最前面的位置,max=nums.length-1,指向数组的最后一个下标。
通过for循环遍历,如果是0就往前面移位,和min的下标互换,然后min+1,如果是2就往后移位,和max的下标位置互换,然后max-1,下一个2就要往前移,这时候互换位置之后,就需要判断换到当前遍历i的值是不是1了,如果不是1,就要回退i–,再遍历,如果是1就放到这个位置。
class Solution {
public void sortColors(int[] nums) {
int numLength = nums.length;
int min = 0, max = numLength -1, temp;
//如果数组只有0个或1个值,直接返回
if(numLength <= 1){
return;
}
//移动0和2,1不移动
for(int i = 0; i <= max; ++i){
//如果等于0就放前面
if(nums[i] == 0){
temp = nums[i];
nums[i] = nums[min];
nums[min] = temp;
min++;
}
//等于2就往后面放,交换位置
if(nums[i] == 2){
temp = nums[i];
nums[i] = nums[max];
nums[max] = temp;
max--;
//判断交换后的当前i下标的值,只有等于1不移动,回退重新循环当前下标
if(nums[i] != 1){
--i;
}
}
}
//打印输出结果
for (int i = 0; i < numLength; i++){
System.out.print(nums[i] + " ");
}
}
}
public class ColorType_75 {
public static void main(String[] args) {
int nums[] = { 2,0,2,1,1,0,1,2,0,2,2,1,2,1,0,2,1,2,1,0,2};
Solution solution = new Solution();
solution.sortColors(nums);
}
}
运行结果:
1 1 1 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 2 2 2