题意描述:给定一个已排好序的数组,求数组中绝对值最小的元素
解题思路一:直接遍历,时间复杂度为O(n),求得数组中绝对值最小的元素
int getMinAbs(int[] num){
//当数组只有一个元素的情况直接返回
if(num.length == 1)
return num[0];
//当数组非负时直接返回num[0],当数组非正时直接返回num[num.length-1]
if(num[0] >= 0)
return num[0];
else if(num[num.length-1] <= 0)
return num[num.length-1];
int min = Math.abs(num[0]);
for(int i=1; i<num.length; i++)
min = Math.min(min, Math.abs(num[i]));
return min;
}
解题思路二:直接遍历求最小的时间复杂度为O(n),并且也没有用到题目中给定的条件---已排序的数组。因此考虑到二分查找,最小的数应该是最大的负数与最小非负数之间绝对值较小的那个数
int getMinAbs(int[] num) {
//当数组只有一个元素的情况直接返回
if(num.length == 1)
return num[0];
//当数组非负时直接返回num[0],当数组非正时直接返回num[num.length-1]
if(num[0] >= 0)
return num[0];
else if(num[num.length-1] <= 0)
return num[num.length-1];
//当数组有正有负时,返回最大的负数与最小的非负数中较小的那一个
int low = 0, high = num.length-1, mid = (low + high)/2;
while(low < high){
if(num[mid] < 0)
low = mid + 1;
else if(num[mid] > 0){
if(num[mid] * num[mid-1] < 0)
return Math.min(Math.abs(num[mid-1]), num[mid]);
high = mid - 1;
}else
return num[mid];
mid = (low + high) / 2;
}
return 0;
}