依然是leecode的算法
题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
一个比较精简的时间复杂度O(n)的方法
function searchInsert($nums, $target) {
foreach($nums as $k=>$v){
if($v >= $target){
return $k;
}
}
return count($nums);
}
然后就是时间复杂度是O(logn)的二分查找
function searchInsert($nums, $target) {
$left = 0;
$right = count($nums) - 1;
while($left <= $right){//此处的判断条件和下边的if判断中的操作息息相关
$mid = intval($left + ($right - $left)/2);//一般在强类型语言定义变量需要防止整型溢出
if($nums[$mid] == $target){//如果直接命中 直接返回
return $mid;
}elseif($nums[$mid] > $target){//如果中位数比目标值大则需要新的右边界为中位数减一的位置,如果不去减一,就会在一些情况下造成left永远比right小或相等从而死循环
$right = $mid - 1;
}else{//如果中位数比目标值小则需要左边界向右挪一位,再去二分
$left = $mid + 1;
}
}
return $left;
}