leetcode原题链接: 搜索插入位置
上一篇:HOT62-N皇后
下一篇:HOT64-搜索二维矩阵
题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 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
解题方法:二分查找,细节决定成败。二分查找主要考察的是细节,包括搜索区间、循环结束条件、最终循环结束后left指针和right指针分别指向什么位置。总结如下:
1. 循环执行的条件: 搜索区间 [left, right]。
2.循环结束后,right指针在left指针的左边。
C++代码
#include <iostream>
#include <vector>
class Solution {
public:
int searchInsert(std::vector<int>& nums, int target) {
int n = nums.size();
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
//循环结束的时候,如果不存在目标值,left指针在right指针的右边,其中right指针指向小于target的最大数
// left指针指向大于target的最小数
return left;
}
};