求绝对值最小的数

据说是百度的面试题啊

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

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

算法实现的基本思路

其实就是个二分查找,使用0作为查找的值。如果没有找到,则也是正数或者负数的零界点。(全是正数或者全是负数的情况除外)。如果是正数,则与左边的负数绝对值比较,如果为负数,则用绝对值与右边的负数比较。

实现代码如下,用python完成的

 1 def getMinAbsoluteValue(array,min,max,key):
 2     if array[min]>=key:
 3         return array[left]
 4     if array[max]<=key:
 5         return abs(array[max])
 6     
 7     while(min <= max):
 8         mid = (min + max)/2 
 9         if array[mid] == key:
10             return array[mid]
11         elif array[mid] > key:
12             max = mid - 1  
13         else:
14             min = mid + 1
15         if (min > max): 
16             if (array[mid]>0):
17                 if abs(array[mid-1])<array[mid]:
18                     return abs(array[mid-1])
19                 else: 
20                     return array[mid]
21             else:
22                 if abs(array[mid])<array[mid+1]:
23                     return abs(array[mid])
24                 else:  
25                     return array[mid+1]
26           
27 
28 if __name__ == '__main__':
29 
30     source1 = [-3,-2,-1,0,1,3,4]
31 
32     source2 = [-5,-4,-1,2,4,5]
33     
34     source3 = [-4,-3,2,3]
35 
36     source4 = [-3,-2,-1]
37 
38     print getMinAbsoluteValue(source1,0,6,0)
39 
40     print getMinAbsoluteValue(source2,0,5,0)
41 
42     print getMinAbsoluteValue(source3,0,3,0)
43 
44     print getMinAbsoluteValue(source4,0,2,0)

 

 算法复杂度 lgn

posted on 2013-01-30 18:50  浪迹天涯cc  阅读(429)  评论(1编辑  收藏  举报

导航