leetcode刷题随记4-搜索插入位置(python3版)

题目描述:

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

请必须使用时间复杂度为 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

解题思路:

一种常见的时间复杂度为O(log(n))的算法是二分查找。为此需要定义两个“指针”left和right,分别指示查找的左端和右端。开始时,left=0,right=len(nums)-1。这里需要注意的是,在Python中,使用内置函数len()来获取列表的长度的时间复杂度是 O(1),这是因为 Python 的列表实现中,会保存列表的长度信息,因此无需遍历整个列表来计算长度。

除了定义两端,还需要定义中间位置的“指针”middle,令middle=left+(right-left)//2即可。

在查找的过程中,如果目标值比中间值更大,说明应该去中间值的右边查找,因此left=middle+1,right不变,并更新middle;如果目标值比中间值更小,则说明应该去中间值的左边查找,left不变,right=middle-1,并更新middle;如果两种情况都不满足,那么说明目标值和中间值相等,这时候返回中间值的下标即可。

循环的条件是left<right,也就是说,如果离开循环后,仍然没有返回值,那么说明数组中不存在target,需要确定插入位置。由于此时left=right,比较nums[left]和target大小即可判断插入位置。

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left=0
        right=len(nums)-1
        while(left<right):
            middle=left+(right-left)//2
            if target>nums[middle]:
                left=middle+1
            elif target<nums[middle]:
                right=middle-1
            else:
                return middle
                
        #  如果离开循环后仍然没有返回值,说明数组中不存在target
        #  此时left=right,比较nums[left]和target的大小即可判断插入位置
        if target<=nums[left]:
            return left
        else:
            return left+1

这里复习一下if,elif和else的用法,写多了C语言的if-else史山,有点忘了。

if,elif(else if的缩写)和 else是 Python 中用于条件控制的关键字。它们一起构成了条件语句,用于在不同的条件下执行不同的代码块。以下是它们的基本用法:if,elif,else按顺序检查,if后面的条件成立时,执行if下面的代码块。如果if后面的条件不成立,会检查elif后面的条件,如果 elif的条件成立,则执行elif下面的代码块。如果前面的条件都不成立,可以使用 else下面的代码块来执行默认的情况。当if或任意一个elif中的条件成立时,后续的elif和else部分将被跳过

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值