给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 为 无重复元素 的 升序 排列数组
-104 <= target <= 104
二分法
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if len(nums)<1: return 0
left=0
right=len(nums)-1
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
return right+1
这段代码实现的是在有序列表中查找目标元素的索引,即插入位置。下面是对代码的解释和总结:
- 定义了一个名为`Solution`的类,其中包含了一个名为`searchInsert`的方法。
- `searchInsert`方法接收一个有序列表`nums`和目标值`target`作为参数,返回目标值在有序列表中的索引或插入位置。
- 首先判断有序列表是否为空,如果为空,则直接返回索引0,表示插入到列表的最开始位置。
- 初始化左指针`left`为0,右指针`right`为有序列表的最后一个元素的索引值。
- 进入循环,条件为`left <= right`,保证要搜索的范围有效。
- 在循环内部,计算中间位置`mid`,通过 `(left + right) // 2` 的方式获取中间位置的索引。
- 判断中间元素`nums[mid]`与目标值`target`的大小关系:
- 如果中间元素等于目标值,则直接返回中间元素的索引。
- 如果中间元素大于目标值,则需要在左侧继续搜索,将右指针`right`更新为`mid - 1`。
- 如果中间元素小于目标值,则需要在右侧继续搜索,将左指针`left`更新为`mid + 1`。
- 如果循环结束仍然没有找到目标值,则返回右指针`right + 1`,表示插入位置。因为右指针`right`停留在比目标值小的最后一个元素上,所以将右指针加1即可得到插入位置。
总结:
该函数通过二分查找的方式在有序列表中搜索目标元素的索引或插入位置。利用左指针和右指针不断调整搜索范围,最终返回结果。这种方法的时间复杂度为O(logN),效率较高。