知识点总结:
排序数组,升序型的数组。
题目内容
搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
我真的不是菜,哈哈哈哈哈哈,服了真的服了
上述菜鸟代码,存在以下问题:
- 逻辑错误:在第一个
for
循环中,代码检查nums[i-1]
是否等于target
,这是错误的。应该是检查nums[i]
是否等于target
。 - 越界问题:在第一个
for
循环中,当i=0
时,nums[i-1]
会引发一个IndexError
,因为它是未定义的。 - 返回值:如果目标值不存在于数组中,代码只返回了一个可能的插入位置,但没有考虑所有可能的插入位置。
- 我忽略了一个芝麻问题:
是的,在Python中,当你使用
range(5)
这样的表达式时,i
确实是从0
开始的。range()
函数生成一个序列,默认情况下从0
开始,以步长1
递增,直到但不包括提供的终止值。因此,range(5)
生成一个包含五个整数的序列:0, 1, 2, 3, 4
。这里是一个简单的例子,展示了for
循环中使用range(5)
时i
的值:(不幸的是我TM的以为是从1开始,OMG,疯狂了p) -
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中,有几种方法可以检查一个值是否存在于列表中。以下是其中的一些:
-
使用
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
已经累了