求绝对值最小的数
据说是百度的面试题啊
有一个已经排序的数组(升序),数组中可能有正数、负数或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