解题思路
75. 颜色分类
第一眼看过去,这不就是数组的排序吗0.0
方法一:直接用库函数排序。
方法二:单指针 + 两次遍历。
方法三:双指针 + 一次遍历。
代码
方法一:直接用库函数排序。
class Solution {
public static void sortColors(int[] nums) {
Arrays.sort(nums);
}
}
方法二:单指针 + 两次遍历
class Solution {
public static void sortColors(int[] nums) {
if(nums.length<2) return ;
int position = 0;
for(int i=0 ; i<nums.length ; i++) {
if(nums[i] == 0) {
swap(nums , i , position);
position++;
}
}
for(int i=position ; i<nums.length ; i++) {
if(nums[i] == 1) {
swap(nums , i , position);
position++;
}
}
}
public static void swap(int[] nums , int i , int k) {
int temp = nums[i];
nums[i] = nums[k];
nums[k] = temp;
}
}
方法三:双指针 + 一次遍历
class Solution {
public static void sortColors(int[] nums) {
if(nums.length<2) return ;
int pos1=0 , pos2=0; //用二个指针来分割0,1,2,分成三部分。pos1前为0,pos1与pos2之间为1,pos2后全为2
for(int i =0 ; i<nums.length ;i++) {
if(nums[i] == 0) {
// 先交换 nums[i] 与 nums[pos2],
// 再交换 nums[pos2] 与 nums[pos1],把小的数逐级交换到前面
swap(nums , pos2 , i);
swap(nums , pos1 , pos2);
pos1++;
pos2++;
}else if(nums[i] == 1) {
swap(nums , pos2 , i);
pos2++;
}
}
}
public static void swap(int[] nums , int i , int k) {
int temp = nums[i];
nums[i] = nums[k];
nums[k] = temp;
}
}