核心演算法:單次遍歷 O(n)
/** 回傳陣列最大值 */
public static int getMaxNum(int[] arr) {
if (arr == null || arr.length == 0)
throw new IllegalArgumentException("陣列不能為空");
int maxIdx = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[i] > arr[maxIdx]) maxIdx = i;
}
return arr[maxIdx];
}
/** 回傳陣列最小值 */
public static int getMinNum(int[] arr) {
if (arr == null || arr.length == 0)
throw new IllegalArgumentException("陣列不能為空");
int minIdx = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[i] < arr[minIdx]) minIdx = i;
}
return arr[minIdx];
}
關鍵點解析
| 細節 | 說明 |
| 初始索引設 0 | 假設首元素為極值,從索引 1 開始比較,減少一次判斷 |
| 回傳值而非索引 | 直接回傳 arr[maxIdx],呼叫端更直觀 |
| 空陣列防禦 | 拋出 IllegalArgumentException,避免 ArrayIndexOutOfBounds |
| 單次遍歷 | 若需同時求最大最小,可合併循環,比較次數約減少 25% |
合併版:單次遍歷求最大最小
public static int[] getMinMax(int[] arr) {
if (arr == null || arr.length == 0) throw new IllegalArgumentException("空陣列");
int min = arr[0], max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) min = arr[i];
else if (arr[i] > max) max = arr[i]; // else if 略減比較
}
return new int[]{min, max};
}
現代 API 替代方案
// Java 8 Stream
int max = Arrays.stream(arr).max().orElseThrow();
int min = Arrays.stream(arr).min().orElseThrow();
// 並行流(大陣列)
int max = Arrays.stream(arr).parallel().max().orElseThrow();
擴展:泛型版支援 Comparable
public static <T extends Comparable<T>> T max(T[] arr) {
if (arr == null || arr.length == 0) throw new IllegalArgumentException();
T max = arr[0];
for (int i = 1; i < arr.length; i++)
if (arr[i].compareTo(max) > 0) max = arr[i];
return max;
}
測試用例
public static void main(String[] args) {
int[] a = {3, -1, 7, 7, 0, 42, -5};
System.out.println("Max: " + getMaxNum(a)); // 42
System.out.println("Min: " + getMinNum(a)); // -5
System.out.println("MinMax: " + Arrays.toString(getMinMax(a))); // [-5, 42]
}