乱序整数序列两数之和绝对值最小
题目描述
给定一个随机的整数(可能存在正整数和负整数)数组 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。 |
解析
- 使用for循环暴力组合破解
- 将数分组 正数一组,负数一组 分组后排序
2.1. 若全正,则找最小的两个 若全负 则找最大的两个
2.2. 若正负结合,则合并两个列表 使用双指针进行求解
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
//-1 -3 7 5 11 15
public class T57 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer> positiveNums = new ArrayList<Integer>();
List<Integer> negativeNums = new ArrayList<Integer>();
Arrays.stream(sc.nextLine().split(" ")).forEach(item -> {
int num = Integer.parseInt(item);
if (num < 0) {
negativeNums.add(num);
} else {
positiveNums.add(num);
}
});
positiveNums.sort((a, b) -> a - b);// 升序
negativeNums.sort((a, b) -> b - a);// 降序
//System.out.println(positiveNums);
//System.out.println(negativeNums);
if(positiveNums.size()==0) {
//纯负数
System.out.println(negativeNums.get(1)+" "+negativeNums.get(0)+" "+Math.abs(negativeNums.get(1)+negativeNums.get(0)));
}
if(negativeNums.size()==0) {
System.out.println(positiveNums.get(0)+" "+positiveNums.get(1)+" "+Math.abs(positiveNums.get(0)+positiveNums.get(1)));
}
if(negativeNums.size()>0&&positiveNums.size()>0) {
//组合 就得组合了 说不定负数那边前两个 正数那边前两个 亦或者 一正一负
int min=Integer.MAX_VALUE;
int minNumber=negativeNums.get(negativeNums.size()-1);
int maxNumber=positiveNums.get(positiveNums.size()-1);
if(negativeNums.size()>=2&&negativeNums.get(0)+negativeNums.get(1)<min) {
min=Math.abs(negativeNums.get(0)+negativeNums.get(1));
minNumber=negativeNums.get(1);
maxNumber=negativeNums.get(0);
}
if(positiveNums.size()>=2&&positiveNums.get(0)+positiveNums.get(1)<min) {
min=Math.abs(positiveNums.get(0)+positiveNums.get(1));
minNumber=positiveNums.get(0);
maxNumber=positiveNums.get(1);
}
//双指针
int left=0;
int right=1;
List<Integer> numsList=new ArrayList<Integer>();
numsList.addAll(negativeNums);
numsList.addAll(positiveNums);
while(left<numsList.size()-1) {
right=left+1;
while(right<numsList.size()) {
if(min>Math.abs(numsList.get(left)+numsList.get(right))) {
min=Math.abs(numsList.get(left)+numsList.get(right));
minNumber=numsList.get(left);
maxNumber=numsList.get(right);
}
//System.out.println(numsList.get(left)+"-"+numsList.get(right)+"-");
right++;
}
left++;
}
System.out.println(minNumber+" "+maxNumber+" "+ min);
}
}
}