【算法训练】LeetCode#75 颜色分类
一、描述
给定一个包含红色、白色和蓝色、共 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]
二、思路
是不是可以理解为少用额外空间的sort...(不妨碍我上来就冒泡,直接3分...)
既然只有三种颜色,那么可以通过两次循环将三种数据分类。第一次循环将0放到头部,第二次循环放1。
三、解题
public class LeetCode75 {
// 冒泡排序
public void sortColorsZero(int[] nums) {
int n = nums.length;
boolean flag = true;
for (int i = 0 ; i < n-1 ; i++){
for (int j = 0 ; j < n-1-i ; j++){
if (nums[j] > nums[j+1] ){
nums[j] = nums[j]^nums[j+1];
nums[j+1] = nums[j]^nums[j+1];
nums[j] = nums[j]^nums[j+1];
flag = false;
}
}
if (flag){
break;
}
}
}
// 分类
public void sortColorsOne(int[] nums) {
int n = nums.length;
int loc = 0;
for (int i = 0 ; i < n ; i++){
if (nums[i] == 0){
int temp = nums[i];
nums[i] = nums[loc];
nums[loc] = temp;
loc++;
}
}
for (int i = 0 ; i < n ; i++){
if (nums[i] == 1){
int temp = nums[i];
nums[i] = nums[loc];
nums[loc] = temp;
loc++;
}
}
}
}