有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现
<?php
$arr1 = [4,6,9,11,12,15];
$arr2 = [-20,-18,-10,-9,-4];
$arr3 = [-10,-5,1,3,9];
//结果1: 4, 结果2: -4, 结果3: 1
echo sprintf('结果1: %s, 结果2: %s, 结果3: %s',
get_min($arr1),
get_min($arr2),
get_min($arr3));
function get_min($arr) {
//分为3中情况,全是正数,全是负数,正负数都有
//大于或等于0的话,最新就是第一个
if ($arr[0] >= 0) {
return $arr[0];
}
//全是负数,则绝对值最小是最后一个数字
if (($end = end($arr)) <= 0) {
return $end;
}
$k = 0;
foreach($arr as $key => $val) {
if ($val >= 0 ) {
$k = $key;
break;
}
}
//下标是k 和 下标是k-1 做比较
if ($arr[$k] >= abs($arr[$k - 1])) {
return $arr[$k - 1];
}
return $arr[$k];
}