package class40; // 给定两个数组A和B,长度都是N // A[i]不可以在A中和其他数交换,只可以选择和B[i]交换(0<=i= lastA && process1(A, B, i + 1, A[i])) { return true; } // 第二种选择 : A[i]和B[i]交换 if (B[i] >= lastA && process1(A, B, i + 1, B[i])) { return true; } return false; } public static boolean letASorted2(int[] A, int[] B) { return process2(A, B, 0, true); } // 当前推进到了i位置,对于A和B都是i位置 // A[i]前一个数字是否来自A : // 如果来自A,fromA = true;如果来自B,fromA = false; // 能否通过题意中的操作,A[i] B[i] 让A整体有序 // 好处:可变参数成了int + boolean,时间复杂度可以做到O(N) public static boolean process2(int[] A, int[] B, int i, boolean fromA) { if (i == A.length) { return true; } if (i == 0 || (A[i] >= (fromA ? A[i - 1] : B[i - 1])) && process2(A, B, i + 1, true)) { return true; } if (i == 0 || (B[i] >= (fromA ? A[i - 1] : B[i - 1])) && process2(A, B, i + 1, false)) { return true; } return false; } // 也可以彻底的贪心:就让A此时的值尽量小!也是可以的。时间复杂度O(N) }