-
题目描述 :
- 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
- 请必须使用时间复杂度为
O(log n)
的算法。
-
思路分析:
- 这段代码的解题思想是利用二分查找的方法在一个有序数组中寻找目标元素的索引或者确定目标元素应该插入的位置。二分查找的核心思想是通过比较目标元素与数组中间位置的元素的大小关系,从而缩小查找范围。在每一步中,根据中间元素与目标元素的大小关系,确定目标元素可能存在的区间,然后不断缩小这个区间范围,直到找到目标元素或确定插入位置为止。
- 通过不断将查找区间一分为二,每次比较都能将待查找元素所在的区间范围减半,从而快速定位目标元素的位置。这种分治的思想使得二分查找算法的时间复杂度为O(log n),相比线性查找具有更高的效率,特别是在大规模数据集中。因此,二分查找是一种高效的查找算法,适用于有序数组这样的情况。
-
解题步骤:
-
1.初始化左右指针:
-
初始化
left
为0,表示数组的起始位置,right
为数组的最后一个位置。
-
-
2.循环查找:
-
在 while 循环中,只要
left
小于等于right
,就继续查找。
-
-
3.计算中间位置:
-
计算中间位置
mid
,通过(left + right) / 2
获得。
-
-
4.比较目标值:
- 如果
nums[mid]
等于目标值target
,则找到目标元素,直接返回mid
。 - 如果
nums[mid]
小于目标值target
,说明目标值在右侧,更新left = mid + 1
。 - 如果
nums[mid]
大于目标值target
,说明目标值在左侧,更新right = mid - 1
。
- 如果
-
5.返回插入位置:
-
当循环结束时,如果没有找到目标元素,则返回
left
,表示应该插入的位置。
-
- 以下是完整代码:
-
class Solution {public int searchInsert(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return left;} }
-
这一期的代码还是比较简单的, 但是可以注意一下小细节, 可以进一步优化代码
-
在这个二分查找算法中,当循环结束时,`left`指向的位置就是目标元素应该插入的位置。这是因为在循环中,`left`始终指向小于等于目标元素的位置,而`right`始终指向大于等于目标元素的位置。
当循环结束时,如果数组中存在目标元素,则会在某个位置`mid`找到它,返回该位置。如果数组中不存在目标元素,`left`将指向第一个大于目标元素的位置,也就是目标元素应该插入的位置。因此,直接返回`left`即可得到正确的插入位置。
这样的设计确保了无论目标元素是否存在于数组中,都能正确返回目标元素应该插入的位置,以保持数组的有序性。
-
-
-