Leetcode算法——35、查询可插入位置

本文介绍了一种在有序数组中查找目标值并确定其插入位置的算法。使用改进的二分法,当目标值不存在于数组中时,能够准确找到保持数组有序所需的插入位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个升序数组和一个目标值,返回目标值的索引。

如果不存在,返回目标值按照顺序应该插入到的位置。

假设数组中没有重复元素。

示例:
Example 1:
Input: [1,3,5,6], 5
Output: 2

Example 2:
Input: [1,3,5,6], 2
Output: 1

Example 3:
Input: [1,3,5,6], 7
Output: 4

Example 4:
Input: [1,3,5,6], 0
Output: 0

思路

在一个有序数组中查询某个目标值的位置,可以使用经典的二分法。

但本题在当查询不到此元素时,需要返回此元素应该插入到的位置,来保证新数组仍然是一个有序数组。

因此,需要在经典二分法的基础上进行改进,如果元素存在,那么逻辑与经典二分法相同;如果元素到最后没有查询到,那么需要额外确认此元素需要插入的位置。

我们使用递归进行二分法,当元素最后没有查询到时,一定是当前数组的长度只有2位时。如果数组第一位不等于目标值,那么肯定小于目标值(因为二分法的每次递归都会保证目标值的大小是位于当前数组的最小值和最大值的范围之内的),因此目标值需要插入的位置肯定是数组的第二位。

python实现

def searchInsert(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: int
    二分法查找。
    结束条件需要改变一下:当查找到最后两位时,如果都不满足,则返回应该插入到的位置。
    """
    def binary_search(nums, l, u, target):
        '''
        二分法查找。
        调用此函数之前需要保证:
        1、nums[l] <= target <= nums[u]
        2、len(nums) >= 2
        '''
        if u - l == 1:
            if nums[l] == target:
                return l
            else:
                return u
        
        mid = (l+u) // 2
        if nums[mid] == target:
            return mid
        elif target > nums[mid]:
            return binary_search(nums, mid, u, target)
        else:
            return binary_search(nums, l, mid, target)
        
    if not nums:
        return 0
    if target <= nums[0]:
        return 0
    if target > nums[-1]:
        return len(nums)
    return binary_search(nums, 0, len(nums)-1, target)
    
if '__main__' == __name__:
    nums, target = [1,3,5,6], 0
    print(searchInsert(nums, target))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值