O(n)
O(1)
import java.util.Scanner; public class Main { public static Scanner sc = new Scanner(System.in); static void swap(int[] arr, int i, int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void main(String[] args) { int n = sc.nextInt(); int[] arr = new int[n]; for(int i=0;i<n;i++){ arr[i] = sc.nextInt(); } int left = -1; // [0, left] int index = 0; // [left + 1, index] int right = n; // [right, N-1] while (index < right){ if(arr[index] == 0){ left ++; swap(arr, left, index); index ++; }else if(arr[index] == 2){ right--; swap(arr, right, index); }else { index ++; } } for(int i=0;i<n-1;i++){ System.out.print(arr[i] + " "); } System.out.println(arr[n-1]); } } /* 5 2 0 1 2 0 0 0 1 2 2 */
灵活一点,几个数字就来几次:时间复杂度:O(n)
import java.util.Scanner; public class Main { public static Scanner sc = new Scanner(System.in); public static void main(String[] args) { int n = sc.nextInt(); int[] arr = new int[n]; for(int i=0;i<n;i++){ arr[i] = sc.nextInt(); } // int n = 5; // int[] arr = {2,0,1,2,0}; // 先把0移动最左边 int pos = moveLeft(arr, 0, n-1, 0); // 再把1移动到次左边 moveLeft(arr, pos+1, n-1, 1); for(int i=0;i<n-1;i++){ System.out.print(arr[i] + " "); } System.out.println(arr[n-1]); } /** * 时间复杂度:O(n) * 空间复杂度:O(1) * 实现 val 全部启动到最左边 */ static int moveLeft(int[] arr, int left, int right, int val){ int u = left-1; // A 区域, u代表最后一个位置 int i = left; // B 区 域,i代表开始的位置 while (i <= right){ // i 向右移动 if(arr[i] == val){ // i位置等于val,那么u位置可以增加了 u ++; // u 加了1的位置, 跟i位置交换 swap(arr, u, i); i++; }else { i ++; } } return u; } static void swap(int[] arr, int i, int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } /* 5 2 0 1 2 0 0 0 1 2 2 */