37 数组的partition调整补充问题
Table of Contents

ac

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
*/

ac2

灵活一点,几个数字就来几次:时间复杂度: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
*/