题目描述
给定一个随机的整数(可能存在正整数和负整数)数组 nums,请你在该数组中找出两个数,其和的绝对值( |nums[x]+nums[y]| )为最小值,并返回这个两个数(按从小到大返回)以及绝对值。
每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
输入描述
一个通过空格分割的有序整数序列字符串,最多1000个整数,且整数数值范围是 [-65535, 65535]。
输出描述
两数之和绝对值最小值
用例
| 输入 | -1 -3 7 5 11 15 | ||||
|---|---|---|---|---|---|
| 输出 | -3 5 2 | ||||
| 说明 | 因为 | nums[0] + nums[2] | = | -3 + 5 | = 2 最小,所以返回 -3 5 2。 |
#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <limits.h>
using namespace std;
vector<int> split(string& s, char delimeter) {
vector<int> res;
string item;
stringstream ss(s);
while(getline(ss, item, delimeter)) {
res.push_back(stoi(item));
}
return res;
}
int main()
{
string str;
getline(cin, str);
vector<int>nums = split(str, ' ');
sort(nums.begin(), nums.end());
int minNum = INT_MAX;
pair<int, int> par;
int left = 0, right=nums.size() - 1;
int diff1 = 0;
while(left < right) {
diff1 = abs(nums[right] + nums[left]);
if (diff1 < minNum) {
minNum = diff1;
par.first = nums[left];
par.second = nums[right];
}
int diff2 = nums[right] + nums[left];
if (diff2 == 0) {
cout << par.first << " " << par.second << " " << diff1 << endl;
return 0;
} else if (diff2 < 0) {
left++;
} else {
right--;
}
}
cout << par.first << " " << par.second << " " << minNum << endl;
return 0;
}