Python菜鸟leecode刷题:数组搜索插入位置

知识点总结

排序数组,升序型的数组。

题目内容

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

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

作者:LeetCode
链接:https://leetcode.cn/leetbook/read/array-and-string/cxqdh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目分析

好了,给位大佬应该已经看出这道题应该如何求解了吧。

我的思路入下所示:

直接用循环查找,如果找到target这个值直接用break退出循环并且返回相应的数组下标index。

还有就是,如果没找到这个数target的话那么,可以用任何排序的方式实现将target和之前的序列的数对比排序,找到应该插入的下标index,例如 :

示例 2:

输入: nums = [1,3,5,6], target = 2--》排序后:1,2,3,5,6   而2真正好在1后边,下标就是1喽
输出: 1(应该插入的位置下标)

很好,菜鸟我用直白的解题思路设想了一遍。

代码如下
class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if target in nums:
            for i in range(len(nums)):
                if nums[i-1]==target:
                    index=i-1
                    return index
                    break
                else :
                    continue
        else :
            for i in range (len(nums)):
              if target >=nums[i-1]:
                  index=i
                  return index

我真的不是菜,哈哈哈哈哈哈,服了真的服了

上述菜鸟代码,存在以下问题:

  1. 逻辑错误:在第一个 for 循环中,代码检查 nums[i-1] 是否等于 target,这是错误的。应该是检查 nums[i] 是否等于 target
  2. 越界问题:在第一个 for 循环中,当 i=0 时,nums[i-1] 会引发一个 IndexError,因为它是未定义的。
  3. 返回值:如果目标值不存在于数组中,代码只返回了一个可能的插入位置,但没有考虑所有可能的插入位置。
  4. 我忽略了一个芝麻问题:

    是的,在Python中,当你使用range(5)这样的表达式时,i确实是从0开始的。range()函数生成一个序列,默认情况下从0开始,以步长1递增,直到但不包括提供的终止值。因此,range(5)生成一个包含五个整数的序列:0, 1, 2, 3, 4。这里是一个简单的例子,展示了for循环中使用range(5)i的值:(不幸的是我TM的以为是从1开始,OMG,疯狂了p)

  5. for i in range(5):
    print(i)

    输出

    0
    1
    2
    3
    4

    这证实了i确实是从0开始的,并且循环会执行五次,每次i的值都会递增1,直到i等于4时循环结束。

我读题真的有问题,人家是要让我“请必须使用时间复杂度为 O(log n) 的算法。”

我TM直接忽略,诶西,人家是让我用二分法实现啊,伟大的*******,算了,在写一写

正确代码:

class Solution(object):  
    def searchInsert(self, nums, target):  
        """  
        :type nums: List[int]  
        :type target: int  
        :rtype: int  
        """  
        left, right = 0, len(nums) - 1  #分别对left和right赋值
          
        while left <= right:  
            mid = left + (right - left) // 2  
              
            if nums[mid] == target:  
                return mid  
            elif nums[mid] > target:  
                right = mid - 1  
            else:  
                left = mid + 1  
          
        # 目标值不存在于数组中,返回应该插入的位置  
        if left < len(nums) and nums[left] == target:  
            return left  
        else:  
            return left + 1

附加知识点,判断某些值是否在数组序列中:

在Python中,有几种方法可以检查一个值是否存在于列表中。以下是其中的一些:

  1. 使用 in 关键字:

 
my_list = [1, 2, 3, 4, 5]
if 3 in my_list:
print("3 在列表中")
else:
print("3 不在列表中")

   2.使用 list.count() 方法:

 

my_list = [1, 2, 3, 4, 5]
if my_list.count(3) > 0:
print("3 在列表中")
else:
print("3 不在列表中")

   3.使用 list.index() 方法:

 

my_list = [1, 2, 3, 4, 5]
if my_list.index(3) != -1:
print("3 在列表中")
else:
print("3 不在列表中")

请注意,list.index() 方法返回元素在列表中的索引。如果元素不在列表中,则返回 -1。因此,我们可以通过检查返回值是否等于 -1 来确定元素是否在列表中。

好了,菜鸟今天只写了一道题,呜呜呜    \(  ::>……<: : ) / so tired

已经累了

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值