题目如题,已知一种需要比较2n次的方法,要求给出一个更优的算法。特别注意优化时间复杂度的常数!
解题思路:原始的方法在遍历数组的时候,每个数组元素都要和Max与Min比较,共比较2n次;可以通过将数组两两分组,用每个分组的最大值与Max进行比较,最小值与Min进行比较来进行优化,这样一来比较次数减少为3n/2。
代码实现如下:
#include <iostream>
#include "limits.h"
using namespace std;
int main() {
int d[] = {9, 6, 7, 5, 13, 6, 2};
int n = 8;
int max = INT_MIN;
int min = INT_MAX;
bool flag = false;
if(n % 2) {
n--;
flag = true;
}
for(int i = 0; i < n-1; i+=2) {
if(d[i] <= d[i+1]) {
if(d[i] < min)
min = d[i];
if(d[i+1] > max)
max = d[i+1];
}
else {
if(d[i] > max)
max = d[i];
if(d[i+1] < min)
min = d[i+1];
}
}
//若数组长度为奇数,还需要和最后一个数作比较
if(flag) {
if(d[n] < min)
min = d[n];
if(d[n] > max)
max = d[n];
}
cout << "The max value of the array is: " << max << endl;
cout << "The min value of the array is: " << min << endl;
}