16. 乱序整数序列两数之和绝对值最小

102 阅读1分钟

题目描述

给定一个随机的整数(可能存在正整数和负整数)数组 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;
}