题目链接:
题目描述:

题目解答:


- 算法思路:代码采用了二分查找算法,通过不断缩小查找范围,来确定目标值在数组中的位置或应插入的位置。二分查找的前提是数组是有序的,这样每次可以将查找范围缩小一半,时间复杂度为 O (log n),其中 n 是数组的长度。
- 代码详解 :
- 初始化指针 :
int left = 0, right = nums.size() - 1;定义了左右指针,初始时,left指向数组的第一个元素,right指向数组的最后一个元素。 - 二分查找循环 :
while (left < right)是二分查找的循环条件,当left小于right时,说明查找范围仍然存在,继续循环。 - 计算中间位置 :
int mid = left + (right - left) / 2;计算中间位置mid,这种计算方式可以避免left和right较大时,left + right可能产生的整数溢出问题。 - 更新指针 :如果
nums[mid] < target,说明目标值在mid的右侧,将left更新为mid + 1;否则,说明目标值在mid的左侧或就是mid,将right更新为mid。 - 确定插入位置 :循环结束后,
left和right相等,此时判断nums[left] < target是否成立,如果成立,说明目标值大于数组中的所有元素,应插入到right + 1的位置;否则,目标值应该插入到right的位置。
- 初始化指针 :
- 示例 4:假设输入数组
nums = [1, 3, 5, 6],target = 2。- 初始时,
left = 0,right = 3,mid = 1,nums[1] = 3 > 2,则right = 1。 - 第二次循环,
left = 0,right = 1,mid = 0,nums[0] = 1 < 2,则left = 1。 - 循环结束,
left = right = 1,nums[1] = 3 > 2,返回right,即 1,也就是目标值 2 应该插入到数组的索引 1 处。
- 初始时,