您的位置:首页 > 其它

文章标题

2016-07-13 10:15 267 查看
有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现

例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。

算法:

1、二分法找一个数,比较前后两个数字是否异号,如果是就找到了分界点

2、如果不异号,数字大于0向前查找,小于0向后查找,等于0 return 0

3、最后退出了查找,说明没有分界点,返回全负的最左端,全整的最右端

int halfCheck(vector<int> num,int start,int end){
if(start > end)
return -1;
int mid = (start + end) / 2;
if(mid == 0)
start = mid + 1;
else{
if(num[mid]*num[mid-1] < 0)
return mid;
else if(num[mid] > 0)
end = mid-1;
else if(num[mid]<0)
start = mid + 1;
else if(num[mid] == 0)
return mid;
}
return halfCheck(num,start,end);
}
int GetAbsMin(vector<int> num){
int key = halfCheck(num,0,num.size()-1);
if(key == -1){
if(num[0]<0)
return num[num.size()-1];
else
return num[0];
}
else
return min(abs(num[key]),abs(num[key-1]));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法