方法一:直接求解
具体方法
遍历两次数组,第一次遍历是将所有的0交换到数组的头部,第二次遍历将所有的1放到0的后面,这就可以满足题目要求了。
使用一个题指针ptr表示 0的范围,从左到右遍历数组,如果找到0,就将0与ptr位置的元素进行交换,ptr+1,遍历结束后,所以的0移动到最前面。
同样的操作将1移动到0的后面。
代码实现
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param colors int整型一维数组
* @return int整型一维数组
*/
public int[] sortColor (int[] colors) {
// write code here
int n = colors.length;
int ptr = 0;
// 将所以的0 移动到前面
for (int i = 0; i < n; ++i) {
if (colors[i] == 0) {
int temp = colors[i];
colors[i] = colors[ptr];
colors[ptr] = temp;
++ptr;
}
}
// 将所以的1移动到0后面
for (int i = ptr; i < n; ++i) {
if (colors[i] == 1) {
int temp = colors[i];
colors[i] = colors[ptr];
colors[ptr] = temp;
++ptr;
}
}
return colors;
}
}
复杂度分析
- 时间复杂度:,其中 是数组nums的长度。
- 空间复杂度:。直接返回结果
方法二:双指针
具体方法
使用双指针来求解,求解方法如下:
从左到右遍历数组,当遍历到i时,此时的元素为colors[i]
- 如果,将其与交换,操作
- 如果,将其与 交换,并将
代码实现
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param colors int整型一维数组
* @return int整型一维数组
*/
public int[] sortColor (int[] colors) {
// write code here
int n = colors.length;
int left = 0, right = n - 1;
for (int i = 0; i <= right; ++i) {
// 如果遇到2 放到最右边
while (i <= right && colors[i] == 2) {
int temp = colors[i];
colors[i] = colors[right];
colors[right] = temp;
--right;
}
//如果遇到0 放到左边
if (colors[i] == 0) {
int temp = colors[i];
colors[i] = colors[left];
colors[left] = temp;
++left;
}
}
return colors;
}
}
复杂度分析
- 时间复杂度:,其中 n是数组nums*的长度。
- 空间复杂度:。直接返回原数组