LintCode : 插入搜索位置
题目
给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引。如果没有,返回到它将会被按顺序插入的位置。你可以假设在数组中无重复元素。
样例
[1,3,5,6],5 → 2
[1,3,5,6],2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6],0 → 0
思路
通过二分法,我们找到一个比目标值小的最大元素,得到他的下标,返回下标+1。如果找到这个元素将直接返回下标。
代码
int searchInsert(vector<int> &A, int target) {
int p = 0;
int r = A.size() - 1;
if(A.size() == 0 || target < A[0]) {
return 0;
}
while(p <= r) {
if(A[(p + r) / 2] == target) {
return (p + r) / 2;
}
else if(A[(p + r) / 2] > target) {
r = (p + r) / 2 - 1;
}
else {
p = (p + r) / 2 + 1;
}
}
if(A[p] > target) {
return p;
}
return p + 1;
}