问题:有一个有序数组,如何求绝对值最小的数。
形如:-10 -5 -2 7 15 20, 绝对值最小为-2
思路:
1。没有正数的情况下,最右边就是绝对值最小的
2。没有负数的情况下,最左边就是绝对值最小的。
3。有正数负数有0的情况下,找到0
4。只有正数负数的情况下,找到分界点
public static int getMinAbsoluteValue(int[] a) {
if(a == null) {
return Integer.MAX_VALUE;
}
int len = a .length;
if(len<1) return Integer.MIN_VALUE;
if(a[0]>=0)return a[0]; //没有负数
if(a[len-1]<=0) return a[len-1];//没有正数
int mid = 0;
int begin = 0;
int end = len-1;
int absMin = 0;
//数组中既有正数又有负数
while(true) {
mid = (begin+end)>>>1;
//如果值等于0,那么就是绝对值最小的数
if(a[mid] == 0) return 0;
else if(a[mid]>0) {//如果值大于0,那么正负数的分界点在左半部分
if(a[mid-1]>0) end = mid-1;
else if(a[mid-1] ==0) return 0;
else break;
}else {//如果值小于0,在数组右半部分查找
if(a[mid+1]<0) {
begin = mid+1;
}else if(a[mid+1] ==0) return 0;
else break;
}
}
//获得正负数分界点出绝对值最小的值
if(a[mid]>0) {
if(a[mid]<Math.abs(a[mid-1])) {
absMin = a[mid];
}else {
absMin = a[mid-1];
}
}else {
if(Math.abs(a[mid])<a[mid+1]) absMin = a[mid];
else absMin = a[mid+1];
}
return absMin;
}