方法一:直接求解

具体方法

遍历两次数组,第一次遍历是将所有的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;
    }
}

复杂度分析

  • 时间复杂度:O(n)O(n),其中 nn 是数组nums的长度。
  • 空间复杂度:O(1)O(1)。直接返回结果

方法二:双指针

具体方法

使用双指针来求解,求解方法如下:

从左到右遍历数组,当遍历到i时,此时的元素为colors[i]

  • 如果colors[i]=0colors[i] = 0,将其与colors[left]colors[left]交换,left+1left+1操作
  • 如果colors[i]=2colors[i] = 2,将其与colors[right]colors[right] 交换,并将right1right-1

alt

代码实现

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;
    }
}

复杂度分析

  • 时间复杂度:O(n)O(n),其中 n是数组nums*的长度。
  • 空间复杂度:O(1)O(1)。直接返回原数组