描述
给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引。如果没有,返回到它将会被按顺序插入的位置。
你可以假设在数组中无重复元素。
您在真实的面试中是否遇到过这个题? 是
样例
[1,3,5,6],5 → 2
[1,3,5,6],2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6],0 → 0
挑战
O(log(n)) time
class Solution {
public:
/**
* @param A: an integer sorted array
* @param target: an integer to be inserted
* @return: An integer
*/
int searchInsert(vector<int> &A, int target) {
// write your code here
int len=A.size();
int began=0,end=len-1,medium=(began+end)/2;
if(target<A[began]||len==0)
return 0;
if(target>A[end])
return end;
while(end>began)
{
if(target<A[medium]) //置换未部与中间坐标
{
end=medium;
medium=(began+end)/2;
}
else if(target>A[medium]) //置换头部与中间坐标
{
began=medium+1;
medium=(began+end)/2;
}
else
{
return medium;
}
//判断头尾的坐标差
if(end==began+1)
return end;
}
}
};
疑问
为什么我的程序运行会出现如下情况?
输入
[]
9
期望答案
0
错误信息
Segmentation fault (core dumped)
运行成功代码
class Solution {
public:
/**
* @param A: an integer sorted array
* @param target: an integer to be inserted
* @return: An integer
*/
int searchInsert(vector<int> &A, int target) {
// write your code here
if(A.size() == 0) //如果
return 0;
int begin = 0;
int end = A.size() - 1;
int mid;
while(begin <= end)
{
mid = (begin+end)/2;
if(target < A[mid])
end = mid-1;
else if(target > A[mid])
begin = mid+1;
else
return mid;
}
return begin;
}
};