算法笔记 -- 35. 搜索插入位置

74 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

一、题目描述:

35. 搜索插入位置 - 力扣(LeetCode)

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为O(logn) O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

示例 4:

输入: nums = [1,3,5,6], target = 0
输出: 0

示例 5:

输入: nums = [1], target = 0
输出: 0

 

提示:

  • 1 <= nums.length <= 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums 为无重复元素的升序排列数组
  • -10^4 <= target <= 10^4

二、思路分析:

当nums中只有一个数据时,target小于等于该数据则返回0,否则返回1

如果nums的长度大于等于2时,此时有三种情况:

target大于nums中的所有值

target大于最小的,小于等于最大的

target小于最小的

三、AC 代码:

func searchInsert(nums []int, target int) int {
    if len(nums) == 1{
        if target > nums[0]{
            return 1
        }else{
            return 0
        }
    }
    for i := 0; i < len(nums) - 1; i++{
        if target > nums[len(nums)-1]{
            return len(nums)
        }else if nums[i] < target && nums[i+1] >= target{
            return i+1     
        }
    }
    return 0
}

四、总结:

标准的二分,二分有很多种写法,也有很多的模板,建议多多练习。熟练了套模板就好了。

范文参考

搜索插入位置 - 搜索插入位置 - 力扣(LeetCode) (leetcode-cn.com)

无需二分查询,O(n)时间复杂度简单到爆炸的代码 - 搜索插入位置 - 力扣(LeetCode)

写对二分查找不是套模板并往里面填空,需要仔细分析题意 - 搜索插入位置 - 力扣(LeetCode) (leetcode-cn.com)