题目描述
给定一个随机的整数(可能存在正整数和负整数)数组nums,请你在该数组中找出两个数,其和的绝对值(|nums[x]+nums[y]|)为最小值, 并返回这两个数(按从小到大返回)以及绝对值。 每种输入只会对应一个答案。但是数组中同一个元素不能使用两遍。
输入描述
一个通过空格分割的有序整数序列字符串,最多1000个整数,且整数数值范围是[-65535,65535]。
输出描述
两数之和绝对值最小值 输入 -1 -3 7 5 11 15
输出
-3 5 2
说明
因为|nums[0]+nums[2]|=|-3+5|=2∣nums[0]+nums[2]∣=∣−3+5∣=2 最小,所以返回-3 5 2
using namespace std;
typedef long long ll;
void init()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
}
signed main()
{
init();
int x;
int nums[1000] = {-1,-3,7,5,11,15};
int res=INT_MAX;
int cur;
int minvalue,maxvalue;
bool flag = 0;
vector<int> vec;
// while(cin>>x)
// vec.push_back(x);
while(scanf("%d",&x)!=EOF)
{
vec.push_back(x);
}
int n;
// cin>>n;
// while (n--)
// {
// cin>>x;
// vec.push_back(x);
// }
sort(vec.begin(),vec.end());
for(int i=0;i<vec.size()-1;i++)
for(int j=i+1;j<vec.size();j++)
{
cur = abs(vec[i]+vec[j]);
if(cur < res)
{
res = cur;
//minvalue = nums[i];排序后可以直接使用nums[i]和nums[j]
//maxvalue = nums[j];
//minindex = i+1;返回索引时可用
//maxindex = j+1;
minvalue = ((vec[i]<vec[j])?vec[i]:vec[j]);//不用排序时可用
maxvalue = ((vec[i]>vec[j])?vec[i]:vec[j]);
}
}
cout<<minvalue<<" "<<maxvalue<<" "<<res<<endl;
return 0;
}