给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
思路:
二分查找法,首先对数组长度为0或1进行特例判断。使用left<right,是在循环体内部排除元素。退出循环的时候left 和 right 重合,区间 [left, right] 只剩下成 1 个元素,这个元素 有可能 就是我们要找的元素。对于此题,如果nums[mid]<target,那么letf=mid+1,若nums[mid]>target,那么right=left。
#include<iostream>
#include <vector>
using namespace std;
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int size = nums.size();
if (size == 0) {
return 0;
}
// 特判
if (nums[size - 1] < target) {
return size;
}
int left = 0;
int right = size - 1;
while (left < right) {
int mid = left + (right - left) / 2;
// 严格小于 target 的元素一定不是解
if (nums[mid] < target) {
// 下一轮搜索区间是 [mid + 1, right]
left = mid + 1;
}
else {
// 下一轮搜索区间是 [left, mid]
right = mid;
}
}
return left;
}
};
int main() {
Solution sol;
vector<int> test = {1,3,5,6};
int target = 7;
int temp = sol.searchInsert(test, target);
cout << temp << endl;
return 0;
}