题目描述
给定一个递增数组,求其中绝对值最小的那个数。
如给定数组为:-8, -5, -2, 3, 5, 7,则返回-2
思路
因为数组是递增序列,所以求绝对值最小的数只可能是位于正负边界的两个数之一,因此对于数组中同时存在正数和负数的情况,可以采用类似二分查找的方法,如果low和mid同号,那么那个绝对值最小的数一定在右侧,将low的值改为mid;如果low和high同号,那么绝对值最小的数一定在左侧,将high改为mid,也就是说,对于数组中有正有负的,一定是往趋向于零的方向找,最后low和high连续时,只要比较这两个数的绝对值就行了。最后,若数组都是正数或者都是负数时,可以直接取到绝对值最小的数。
代码
public static void main(String[] args) {
int[] a = {-8, -5, -2, 3, 5, 7};
System.out.println(absMin(a, 6)); //运行输出-2
}
public static int absMin(int[] a, int size) {
if(size == 1)
return a[0];
//考虑数组都是正数或者都是负数的情况
if(a[0] * a[size-1] >= 0)
return (a[0] >= 0) ? a[0] : a[size-1];
else
{
int low = 0, high = size-1, mid = 0;
while(low < high)
{
//当两个数临近时,直接取绝对值小的那个数
if(low + 1 == high)
return Math.abs(a[low]) < Math.abs(a[high]) ? a[low] : a[high];
mid = low + (high - low) / 2;
//左边同号时(必然都是负数(或者一个零),往右边找)
if(a[low] * a[mid] >= 0)
low = mid;
//右边同号时(必然都是正数(或者一个零),往左边找)
if(a[high] * a[mid] >= 0)
high = mid;
}
return a[mid];
}
}