遞歸分治代碼邏輯正確,但 main 中 max、min 始終為 0。原因:**Java 基本類型參數傳遞是值傳遞**,遞歸內部修改形參 Max、Min 不影響實參。
class Result { int max; int min; }
public static void findMaxMin(int[] arr, int start, int end, Result res) {
if (end - start <= 1) {
res.max = Math.max(arr[start], arr[end]);
res.min = Math.min(arr[start], arr[end]);
return;
}
int mid = (start + end) / 2;
Result left = new Result(), right = new Result();
findMaxMin(arr, start, mid, left);
findMaxMin(arr, mid + 1, end, right);
res.max = Math.max(left.max, right.max);
res.min = Math.min(left.min, right.min);
}
// 調用
Result res = new Result();
findMaxMin(arr, 0, arr.length - 1, res);
System.out.println("max=" + res.max + ", min=" + res.min);
static class Pair { int max, min; }
public static Pair findMaxMin(int[] arr, int l, int r) {
if (l == r) return new Pair(arr[l], arr[l]);
if (r - l == 1) return new Pair(Math.max(arr[l], arr[r]), Math.min(arr[l], arr[r]));
int mid = (l + r) / 2;
Pair left = findMaxMin(arr, l, mid);
Pair right = findMaxMin(arr, mid + 1, r);
return new Pair(Math.max(left.max, right.max), Math.min(left.min, right.min));
}
// 用長度為1的數組模擬引用
public static void findMaxMin(int[] arr, int l, int r, int[] max, int[] min) {
// ... 遞歸內部 max[0] = ...; min[0] = ...;
}
3n/2 - 2 優於線性掃描 2n-2,教學價值高,工程上通常直接 Collections.min/max 或流式 IntStream.of(arr).min()。將 int Max, Min 改為 Result 對象引用,遞歸賦值 res.max = ... 即可修復,邏輯完全保留。