初始化 max = min = arr[0],單次遍歷陣列,逐項比較更新:
if (val > max) max = val;if (val < min) min = val;時間複雜度 O(n),空間複雜度 O(1),最佳解法。
public class ArrayMinMax {
public static void main(String[] args) {
int[] arr = {74, 48, 30, 17, 62};
int min = arr[0], max = arr[0];
System.out.print("陣列元素:");
for (int v : arr) {
System.out.print(v + " ");
if (v > max) max = v;
if (v < min) min = v;
}
System.out.println("\n最大值:" + max);
System.out.println("最小值:" + min);
}
}
輸出:
陣列元素:74 48 30 17 62
最大值:74
最小值:17
| 情況 | 處理方式 |
|---|---|
| 空陣列 | 拋 IllegalArgumentException 或回傳 OptionalInt |
| 單一元素 | max = min = 該元素,迴圈不執行,正確 |
| 全相同元素 | max = min = 該值,正確 |
| 含 Integer.MIN/MAX_VALUE | 初始化用陣列首元素避免溢位風險 |
int[] arr = {74, 48, 30, 17, 62};
int max = Arrays.stream(arr).max().orElseThrow();
int min = Arrays.stream(arr).min().orElseThrow();
// 或一次遍歷取得摘要統計
IntSummaryStatistics stats = Arrays.stream(arr).summaryStatistics();
System.out.println("max=" + stats.getMax() + ", min=" + stats.getMin());
// ForkJoinPool 並行歸約
int max = Arrays.stream(arr).parallel().max().orElseThrow();
陣列長度 > 1 萬時並行可能加速,但有執行緒池開銷,需實測。
int maxIdx = 0, minIdx = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[i] > arr[maxIdx]) maxIdx = i;
if (arr[i] < arr[minIdx]) minIdx = i;
}
OptionalInt 或拋異常。summaryStatistics() 可一次取得 max/min/sum/count/average。