题目:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
链接 https://leetcode.cn/problems/search-insert-position/
看到题目就想使用二分法,首先先解决最简单的情况,也就是当目标数字小于等于列表第一个数或者大于最后一个数时,直接返回插入位置
接下来考虑其他位置的情况,使用tempLen记录每一次二分后得到的列表长度,这里加上0.5相当于向上取整,使用result标记每一次二分后目标数字target要比较的列表位置,思考二分停止条件:当target小于等于result位置数字,并大于其左边位置数字,则target应插入在result位置
若大于result位置数字则计算下一次二分得到的长度,即tempLen = int(tempLen / 2 + 0.5),计算在列表中的位置:result = result + tempLen,在左边二分同理
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
tempLen = int(len(nums)/2+0.5)
result = int(len(nums)/2)
if target > nums[-1]:
return len(nums)
elif target <= nums[0]:
return 0
else:
for i in range (int(len(nums)/2+0.5)):
if target <= nums[result] and target > nums[result-1]:
return result
# 右边二分,计算二分后的长度tempLen,计算新的要比较的数字位置result
elif target > nums[result]:
tempLen = int(tempLen / 2 + 0.5)
result = result + tempLen
# 左边二分
else:
tempLen = int(tempLen / 2 + 0.5)
result = result - tempLen
看了其他人的题解,感觉我的还是麻烦了,新手
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid - 1
else:
left = mid + 1
return left
代码(左闭右开)
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)
while left < right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid
else:
left = mid + 1
return left
作者:edelweisskoko
链接:https://leetcode.cn/problems/search-insert-position/solution/35-sou-suo-cha-ru-wei-zhi-er-fen-fa-de-l-6dz5/
来源:力扣(LeetCode)
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
nums.append(target)
nums.sort()
return nums.index(target)
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
return bisect.bisect_left(nums, target)