1:题目描述(力扣)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
2:解题思路
可以使用暴力的解法和二分法来讲解此题
第一种解法:暴力遍历解法
题目给出的是一个排序的数组。
从下标0开始遍历数组,当目标值target小于当前遍历的值,说明target不在原数组中,并且后面的元素都大于目标值,则需要将目标值target在当前位置插入数组,即返回当前下标;
当目标值target等于当前遍历的值,说明找到在数组中找到了元素,即返回当前下标。
代码展示:
class Solution:
def searchInsert(self, nums, target):
for i in range(len(nums)):
if nums[i] >= target:
return i # 当nums[i]大于target时,需要将target插入当前位置,当nums[i]等于target,则找到了目标元素
return len(nums) # 当nums最大的元素都小于目标值时,需要将目标值插入到数组末尾
第二种解法:二分法
第一步:先初始化左边界下标(left=0)和右边界下标(right=len(nums))
第二步:当left <= right时,进入循环,获取中间元素下标(mid=(left+right)//2),当nums[mid] < target,修改左边界下标,left=mid+1;当nums[mid] > target,修改右边界下标,right=mid-1,当nums[mid] = target,返回mid
第三步:当目标值不在数组中,1:当目标值小于第一个元素,经过第二步,未找到目标值,此时right<left,需要将目标值插入数组,插入后下标为right+1;2:当目标值处于中间某两个元素中间,需要将目标值插入右边较大的元素位置,插入后下标为right+1;3:当目标值大于最后一个元素,经过第二步,未找到元素,需要将目标值插入数组末尾,插入后下标为right+1
代码展示:
class Solution:
def searchInsert(self, nums, target):
left, right = 0, len(nums) - 1
while left <= right:
middle = (left + right) // 2
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle - 1
else:
return middle
return right + 1 # 当没有找到元素时,插入目标元素的位置