【问题描述】
给定一组正整数,其中最大值和最小值分别为Max和Min, 其中一个数x到Max和Min的距离差定义为:
abs(abs(x-Max)-(x-Min))
其中abs()为求一个数的绝对值
【输入形式】
包括两行,第一行一个数n,表示第二行有n个正整数
【输出形式】
输出一个数x,该数在所有n个数中的距离差最小;如果有两个数的距离差都是最小,输出较小的哪个
【样例输入1】
5 3 1 7 5 9
【样例输出1】
5
【样例输入2】
3 1 3 2
【样例输出2】
2
【思路分析】
通过维护最大最小值,可以获得常数时间复杂度的优化。提供的代码的时间复杂度为,空间复杂度为
。空间复杂度应该可以继续降低,我暂时没有思路。
#include <iostream>
#include <climits>
using namespace std;
int main() {
int n, min = INT_MAX, max = INT_MIN, res, minDiff = INT_MAX;
cin >> n;
int nums[n];
for (int i = 0; i < n; ++i) {
cin >> nums[i];
if (max < nums[i]) max = nums[i];
if (min > nums[i]) min = nums[i];
}
for (const auto &item: nums) {
int diff = abs(max + min - 2 * item);
if (diff < minDiff) {
minDiff = diff;
res = item;
} else if (diff == minDiff && item < res) res = item;
}
cout << res;
return 0;
}