给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
解法:二分查找,未找到则跟最终索引的值对比,小于等于则取当前索引,否则取当前索引+1
PHP
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer
*/
function searchInsert($nums, $target)
{
return $this->binSearch($nums, $target, 0, count($nums) - 1);
}
function binSearch(&$nums, $target, $start, $end)
{
if ($start >= $end) {
return $nums[$start] >= $target ? $start : $start + 1;
}
$middle = floor(($start + $end) / 2);
if ($nums[$middle] == $target) {
return $middle;
} elseif ($nums[$middle] > $target) {
return $this->binSearch($nums, $target, $start, $middle - 1);
} else {
return $this->binSearch($nums, $target, $middle + 1, $end);
}
}
}
GO
func searchInsert(nums []int, target int) int {
return binarySearch(&nums, target, 0, len(nums) - 1)
}
func binarySearch(nums *[]int, target int, start int, end int) int {
if start >= end {
if (*nums)[start] >= target {
return start
} else {
return start + 1
}
}
middle := int(math.Floor(float64((start + end) / 2)))
if (*nums)[middle] == target {
return middle
}
if target >= (*nums)[middle] {
return binarySearch(nums, target, middle + 1, end)
} else {
return binarySearch(nums, target, start, middle - 1)
}
}