【问题描述】
给定一组正整数,其中最大值和最小值分别为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;
}