题目链接:
题目描述:

题目解答:


- 算法思路:代码采用了二分查找算法,通过不断缩小查找范围,来确定目标值在数组中的位置或应插入的位置。二分查找的前提是数组是有序的,这样每次可以将查找范围缩小一半,时间复杂度为 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 处。
- 初始时,