文章标题
2016-07-13 10:15
267 查看
有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现
例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。
算法:
1、二分法找一个数,比较前后两个数字是否异号,如果是就找到了分界点
2、如果不异号,数字大于0向前查找,小于0向后查找,等于0 return 0
3、最后退出了查找,说明没有分界点,返回全负的最左端,全整的最右端
例如,数组{-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])); }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法