2020.05.28 力扣 - 数组 - 35 搜索插入位置

127 阅读1分钟

【题目】

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。

如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

【示例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
}

【结果】