题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。
解法一:递归
代码
func searchInsert(nums []int, target int) int {
l := len(nums)
if l == 0 {
return 0
}
if l == 1 {
if nums[0] >= target {
return 0
}
return 1
}
mid := l / 2
if nums[mid] == target {
return mid
}
if nums[mid] < target {
return mid + searchInsert(nums[mid: l], target)
}
return searchInsert(nums[0: mid], target)
}
思路
典型的二分查找,只是将无法找到元素的情况替换成了返回位置。
用递归思路上比较清晰
- 判断target和mid的大小,大则到右边数组查找,小则到左边数组查找
- 停止条件:数组为空,则返回0。数组剩一个元素,则比较后返回0或1.
解法二:循环
代码
func searchInsert(nums []int, target int) int {
low, high := 0, len(nums)
for low < high {
mid := low + (high-low)/2
if nums[mid] < target {
low = mid + 1
continue
}
if nums[mid] > target {
high = mid
continue
}
return mid
}
return low
}
思路
使用循环的时候注意这里的high标志,是数组的结束标识,是不包括在数组中的。
初始化的时候 high = len(nums)
当target < mid的时候, high = mid