数组里找到和最接近于0的两个值?或者和等于0的两个值

来源:互联网 发布:关注黄金价格的软件 编辑:程序博客网 时间:2024/06/14 00:35

与“寻找数组中满足和为定值的两个数”问题的思路一样:

首先先排序;

然后定义两个首尾指针left、right,逐次判断a[i]+a[j]?=0:

①如果某一刻a[left]+a[right]>0, 和应该要变小,则left不动,right--,

②如果某一刻a[left]+a[right]<0, 和应该要变大,则left++,right不动。

③如果某一时刻a[left]+a[right]=0,则直接退出循环。

同时还要注意,题目还要求最接近0的两个数?

所以定义Diff变量保存两数和与0最小的距离,first和second变量保存与0有最小距离的两个数的数组下标。

当a[right]+a[left]>0或者a[right]+a[left]<0时,要判断当前这两个数和与0的距离是否还要小于Diff,如果是则要更新Diff、first、second三个变量。

public static void zero(int[] a){Arrays.sort(a); int left = 0, right = a.length-1;                 int Diff = a[right]+a[left];int first=-1,second=-1;while(left<right){if(a[right]+a[left]>0){if(Math.abs(a[right]+a[left])<=Math.abs(Diff)){Diff = a[right]+a[left];first = left;second = right;}right--;}else if(a[right]+a[left]<0){if(Math.abs(a[right]+a[left])<=Math.abs(Diff)){Diff = a[right]+a[left];first = left;second = right;}left++;}else{first = left;second = right;break;}}System.out.println("满足条件的两个数是"+a[first]+" "+a[second]);}

0 0
原创粉丝点击