📅  最后修改于: 2023-12-03 15:06:57.039000             🧑  作者: Mango
当我们需要在一个数组中寻找最大值和最小值时,我们通常使用两个循环,同时记录当前最大值和最小值。不过,这种方法需要进行$2n$次比较,所以当数据量很大时,时间复杂度就会非常高。
在这里,我们介绍一个只需要进行$3n/2$次比较的算法来寻找最大值和最小值。
我们先对数组的相邻两个元素进行比较,得到较大和较小的数。然后,将较大的数与当前记录的最大值比较,较小的数与当前记录的最小值进行比较,更新最大值和最小值。这个过程需要进行$3n/2$次比较。
代码实现如下:
public class MinMaxValue {
static class Pair {
int min;
int max;
}
public static Pair getMinMax(int[] arr, int low, int high) {
Pair pair = new Pair();
int mid;
Pair pair1 = new Pair();
Pair pair2 = new Pair();
if (low == high) {
pair.min = arr[low];
pair.max = arr[low];
return pair;
}
if (high == low + 1) {
if (arr[low] > arr[high]) {
pair.max = arr[low];
pair.min = arr[high];
} else {
pair.max = arr[high];
pair.min = arr[low];
}
return pair;
}
mid = (low + high) / 2;
pair1 = getMinMax(arr, low, mid);
pair2 = getMinMax(arr, mid + 1, high);
if (pair1.min < pair2.min)
pair.min = pair1.min;
else
pair.min = pair2.min;
if (pair1.max > pair2.max)
pair.max = pair1.max;
else
pair.max = pair2.max;
return pair;
}
}
我们可以使用这个函数来查找整个数组的最大值和最小值:
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
int n = arr.length;
Pair pair = MinMaxValue.getMinMax(arr, 0, n - 1);
System.out.println("最小值:" + pair.min);
System.out.println("最大值:" + pair.max);
这个算法的时间复杂度为$O(n)$,比传统的方法要快很多。