解法1、
我们可以吧数字中的最大值和最小值看成两个独立的问题分别求出数组中的最大值和最小值。
直接的方法就是扫描数字,找到最大数以及最小数。
<span style="font-size:18px;">bool MaxMin(std::vector<T> array, T* max, T* min) {
if (array.size() < 1) {
return false;
}
*max = array[0];
*min = array[0];
size_t array_size = array.size();
for (int i = 1; i < array_size; ++i) {
if (array[i] > *max) {
*max = array[i];
} else if (array[i] < *min) {
*min = array[i];
}
}
return true;
}
</span>
解法2、
数组中的一对一对的数相互比较,比较中较大的一个和max比较,较小的和min比较,总计有N/2对数,分别和max和min进行一次比较,共计3N/2次比较。
template<typename T>
bool MaxMin_1(std::vector<T> array, T* max, T* min) {
if (array.size() < 1) {
return false;
}
*max = array[0];
*min = array[0];
int index = 1;
int array_size = array.size();
while(index < array_size && index +1 <array_size) {
if (array[index] >= array[index + 1]) {
if (array[index] > *max) {
*max = array[index];
}
if (array[index + 1] < *min) {
*min = array[index + 1];
}
} else {
if (array[index + 1] > *max) {
*max = array[index + 1];
}
if (array[index] < *min) {
*min = array[index];
}
}
index += 2;
}
if (index < array.size()) {
if (array[index] > *max) {
*max = array[index];
}
if (array[index] < *min) {
*min = array[index];
}
}
return true;
}
3、 分治法
template<typename T>
bool MaxMin_2(std::vector<T> array, int start, int end, T* max, T* min) {
if (end - start > 1) {
MaxMin_2(array, start, (start + end) / 2, max, min);
MaxMin_2(array, (start + end) / 2 + 1, end, max, min);
} else {
if (array[end] > array[start]) {
if (array[end] > *max) {
*max = array[end];
}
if (array[start] < *min) {
*min = array[start];
}
} else {
if (array[start] > *max) {
*max = array[start];
}
if (array[end] < *min) {
*min = array[end];
}
}
}
}
template<typename T>
bool MaxMin_3(std::vector<T> array, int start, int end, T* max, T* min) {
if (end > start) {
MaxMin_2(array, start, (start + end) / 2, max, min);
MaxMin_2(array, (start + end) / 2 + 1, end, max, min);
} else {
if (array[start] > *max) {
*max = array[start];
}
if (array[start] < *min) {
*min = array[start];
}
}
}