首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 分治法求數組最大最小值:值傳遞導致結果丟失的修正方案

     編輯:程式設計疑難解答

問題現場

遞歸分治代碼邏輯正確,但 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));
}

修正方案三:數組/AtomicInteger 偽引用


// 用長度為1的數組模擬引用
public static void findMaxMin(int[] arr, int l, int r, int[] max, int[] min) {
    // ... 遞歸內部 max[0] = ...; min[0] = ...;
}

核心知識點

  • Java **基本類型、String、引用變量本身**均為**值傳遞**。
  • 遞歸/函數需「返回結果」或「修改可變對象內部狀態」才能將計算結果帶回調用方。
  • 分治法比較次數 3n/2 - 2 優於線性掃描 2n-2,教學價值高,工程上通常直接 Collections.min/max 或流式 IntStream.of(arr).min()。

將 int Max, Min 改為 Result 對象引用,遞歸賦值 res.max = ... 即可修復,邏輯完全保留。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved