【题目】
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。
如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
【示例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
【思路】
看到排序数组,目标值等字眼,就想到了二分查找算法。
然后就尝试撸代码啦,第一想法就是递归。
提交完自己的代码后发现有更好的解法 => 循环 =>双指针的使用,
第三次遇见双指针了,好亲切!
【代码】
// 递归
func searchInsert(nums []int, target int) int {
cnt := len(nums)
if cnt == 0 {
return 0
}
if cnt == 1 {
if nums[0] >= target {
return 0
}
return 1
}
middle := cnt / 2
if target == nums[middle] {
return middle
}
if target < nums[middle] {
return searchInsert(nums[:middle], target)
}
return middle + 1 + searchInsert(nums[middle+1:], target)
}
// 主函数
func main() {
nums := []int{1, 3, 5, 6, 9}
val := 5
ret := searchInsert(nums, val)
fmt.Println(ret)
// 2
val = 2
ret = searchInsert(nums, val)
fmt.Println(ret)
// 1
val = 7
ret = searchInsert(nums, val)
fmt.Println(ret)
// 4
val = 0
ret = searchInsert(nums, val)
fmt.Println(ret)
// 0
val = 10
ret = searchInsert(nums, val)
fmt.Println(ret)
// 5
}
// 循环
func searchInsert(nums []int, target int) int {
l := 0
r := len(nums) - 1
for l <= r {
midd := (l + r) / 2
if target == nums[midd] {
return midd
} else if target < nums[midd] {
r = midd - 1
} else {
l = midd + 1
}
}
return l
}
// 主函数
func main() {
nums := []int{1, 3, 5, 6, 9}
val := 5
ret := searchInsert(nums, val)
fmt.Println(ret)
// 2
val = 2
ret = searchInsert(nums, val)
fmt.Println(ret)
// 1
val = 7
ret = searchInsert(nums, val)
fmt.Println(ret)
// 4
val = 0
ret = searchInsert(nums, val)
fmt.Println(ret)
// 0
val = 10
ret = searchInsert(nums, val)
fmt.Println(ret)
// 5
}
【结果】
