请用递归实现找到数组中的最大(最小)值: 1)使用在第k个元素和剩余n-k个元素中的最大(小)值比较 2)使用数组的左半边和右半边比较。
时间: 2024-10-23 11:13:48 浏览: 29
要使用递归实现寻找数组中的最大值或最小值,我们可以分别处理这两种情况:
1) **找到数组中的第k个元素与剩余n-k个元素的最大值/最小值**:
```java
public int findMax(int[] arr, int k, boolean isMax) {
// 基线条件:如果只剩下一个元素或k等于0,返回该元素
if (arr.length <= k || k == 0) {
return arr[0];
}
// 递归步骤:比较当前元素与剩余部分的最大值
return isMax ? Math.max(arr[k - 1], findMax(arr, k - 1, true)) :
Math.min(arr[k - 1], findMax(arr, k - 1, false));
}
// 使用时,调用 findMax(arr, n / 2, true) 或者 findMax(arr, n / 2, false),其中n是数组长度
```
2) **使用数组的左半边和右半边比较**:
这种方法通常用于分治算法中,例如二分查找的最大/最小值。假设数组已排序,我们将数组分为两半,然后比较左右两边的头尾元素。
```java
public int findMinMaxSorted(int[] arr) {
// 如果只有一个元素,直接返回
if (arr.length == 1) {
return arr[0];
}
// 如果有两个元素,返回较小的大于或小于中间值
if (arr.length == 2) {
return arr[0] < arr[1] ? arr[0] : arr[1];
}
// 分治法:取中间元素,然后分别对比左半边和右半边的极端值
int mid = arr.length / 2;
return arr[mid] < arr[arr.length - 1] ?
findMinMaxSorted(Arrays.copyOfRange(arr, 0, mid)) :
findMinMaxSorted(Arrays.copyOfRange(arr, mid, arr.length));
}
```
请注意,未排序数组找到最大值和最小值时可能需要遍历整个数组,因此上述两种方法对于未排序数组不是最优解。如果数组已经排序,那么第二种方法更有效率。
阅读全文