from: http://www.cnblogs.com/nokiaguy/archive/2013/01/29/2881476.html
有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现
例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。
原文用java写的,没看太懂,但很感谢博主的算法思路,即找正负数的临界值。于是我用C++实现了一遍,代码如下:
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 int getMinNum(int arr[],int n) 5 { 6 int index=0; 7 int temp; 8 if(arr[index]>0) 9 return arr[index]; 10 else if(arr[index]<0&&arr[n-1]<0) 11 return abs(arr[n-1]); 12 else 13 { 14 for(int i=index;i<n;i++) 15 { 16 if(arr[i]<0) 17 continue; 18 else 19 { 20 temp=abs(arr[i-1]); 21 if(arr[i]<=temp) 22 temp=arr[i]; 23 return temp; 24 } 25 } 26 } 27 } 28 int main() 29 { 30 int arr[]={-20,-13,-4,6,77,200}; 31 int minNum; 32 minNum=getMinNum(arr,6); 33 cout<<"the abs min num is "<<minNum<<endl; 34 return 0; 35 }