Python学习日记——搜索插入数字

Python学习日记009——搜索插入数字

题目来源:LeetCode题库——搜索插入数字
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
Example1:
输入: [1,3,5,6], 5
输出: 2
Example2:
输入: [1,3,5,6], 2
输出: 1
Example3:
输入: [1,3,5,6], 7
输出: 4
Example4:
输入: [1,3,5,6], 0
输出: 0
链接:https://leetcode-cn.com/problems/search-insert-position

搜索插入数字——暴力求解
解决这个问题,首先想到的方法是暴力穷举法,即从数组中的第一个元素开始,判断题中所给target值与它的关系。如果target值在数组中,那么可以找到其所在位置。如果target值不在数组中,那么可以找到介于target值两侧的两个元素,即 nums[i] < nums[i+1]。但是暴力穷举法消耗的时间较长,因此可以寻求其他方法。

搜索插入数字——二分查找法
二分查找是对列表值进行查找的另一种常用方法,其使用前提是列表中的元素必须是事先排好序的。二分查找法的优点在于,每次比较之后都排除了一半的元素。
本文对待此问题,分成两个大部分来解决。首先需要判断题中所给的target值是否在数组中。
①对于target值在数组中的情况,我们即可以利用二分查找法去查找target值所在的位置。我们分别用 low 和 high 来表示列表中当前要查找的第一个下标和最后一个下标。初始情况下, low 是 0 ,high 是 len(nums)-1,mid 表示中间元素的下标,因此 mid = ( low + high ) // 2。
二分过程具体如下:

if target < nums[mid]:
                    high = mid - 1
                elif target == nums[mid]:
                    return mid
                else:
                    low = mid + 1

经过多次二分,直到找到 target == nums[mid]结束,返回 mid 的值。

②对于target值不在数组中的情况,因为数组中的元素是按顺序排列的,因此当我们从头遍历数组时,找到第一个大于 target 值的元素时,插入数组按序则应该插在这个元素的前面,即这个元素原来的位置。如果数组中所有元素都比target值小,那么该target值应该插在数组最后。

具体实现过程如下:

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        """search-insert-position"""
        if target in nums:        #target值在数字内
            low = 0        #初始状态要查找的第一个下标
            high = len(nums) - 1        #初始状态要查找的最后一个下标
            while high >= low:
                mid = (low + high) // 2        #中间元素的下标
                if target < nums[mid]:
                    high = mid - 1
                elif target == nums[mid]:
                    return mid
                else:
                    low = mid + 1

        else:        #target值不在数组内
            for i in range(len(nums)):
                if nums[i] > target:
                    return i
            return i+1

注:在力扣的评论区还看到了另一种用内置函数解决问题的方法,其通过添加、排序、查找三个步骤即解决了问题,代码特别简洁明了:

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        """search-insert-position"""       
        nums.append(target)
        nums.sort()
        return nums.index(target)
        

因此对于不同的方法,根据实际情况可灵活选择。

学习过程中,欢迎指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值