目录
1、题目描述
2、题目分析
3、答案解析
1、题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
2、题目分析
看到题目,先看到时间复杂度为 O(log n)
的算法,直接使用二分查找算法。看到题目要求,找目标值返回索引,如果目标值存在的话就返回对应的索引,简单的if判断返回即可;但如果目标值不存在则返回按顺序插入的位置这一要求是一个大难点,应该怎么实现?
用一个下标指向数组首元素,用一个下标指向数组末尾元素,然后使用二分查找算法,二分查找的中间索引为:(左下标+右下标)/2:
int left = 0;
int right = numsSize - 1;
int mid = (left+right)/2;
当目标值小于等于数组的索引值时,更新返回值和右下标,否则更新左下标,最后返回预定的返回值就行。
if(nums[mid] >= target)
{
ret = mid;
right = mid - 1;
}
else
{
left = mid + 1;
}
但存在特殊情况,当目标值不存在数组中,且目标值比数组的最大值还大时,上面解答就存在错误,所以定义返回值的时候需要初始化为数组的大小,其对应的索引刚好是数组末尾的下一个元素。
int ret = numsSize;
3、题目答案
int searchInsert(int* nums, int numsSize, int target) {
int left = 0, right = numsSize - 1, ans = numsSize;
while (left <= right) {
int mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/search-insert-position/solutions/333632/sou-suo-cha-ru-wei-zhi-by-leetcode-solution/
来源:力扣(LeetCode)。