leetcode35:搜索插入位置

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

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

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

思路:二分查找
首先如果target在列表中,直接利用列表的index方法返回target的索引;
如果不在列表中就要找到插入位置的索引。
确定中间位置之后,判断中间位置的值与target的大小关系,如果nums[mid]<target,那么target就应该插在mid右边的某个位置,下面继续判断,如果target<nums[mid+1],target就应该插在mid+1这个位置,否则的话nums[mid+1]<target就更新low=mid+1;同理得nums[mid]>target的情况。low和high不断更新的过程中,如果没能找到插入的位置,就说明target要么大于要么小于列表中所有元素,此时low=high=len(nums)-1/0.再进一步判断属于两者哪种情况,返回对应的插入位置的索引值。(这个方法中mid+1、mid-1可能会出现索引错误,所以可以在刚开始的时候把头插和尾插两种特殊情况考虑进去,除此之外的情况就完全包括在while loop里边了)

class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if target in nums:
            return nums.index(target)
        low = 0
        high = len(nums)-1
        if target<nums[0]:
            return 0
        if target>nums[-1]:
            return high+1
        while low<=high:
            mid = (low+high)//2
            if nums[mid]<target:
                if target<nums[mid+1]:
                    return mid+1
                else:
                    low = mid+1
            else:
                if nums[mid-1]<target:
                    return mid
                else:
                    high = mid-1
        return low
class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if target in nums:
            return nums.index(target)
        low = 0
        high = len(nums)-1
        while low<high:
            mid = (low+high)//2
            if nums[mid]<target:
                if target<nums[mid+1]:
                    return mid+1
                else:
                    low = mid+1
            else:
                if nums[mid-1]<target:
                    return mid
                else:
                    high = mid-1
        if target<nums[0]:
            return 0
        else:
            return low+1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值