给定一个排序数组nums(无重复元素)与目标值target, 如果target在nums里出现,则返回target所在下标,如果target在nums里未出现,则返回target应该插入位置的数组下标,使得将target插入数组nums后,数组仍有序。
#include<vector>
class Solution
{
public:
Solution() {}
~Solution() {}
int searchInsert(std::vector<int> &nums, int target)
{
int Index = -1;
int begin = 0;
int end = nums.size()-1;
while (Index==-1)
{
int mid = (begin + end) / 2;
if (target==nums[mid])
{
Index=mid;
}
else if (target<nums[mid])
{
if (mid == 0 || target > nums[mid - 1])
//注意此处不能写为if ((target>nums[mid-1])||(mid==0))。因为先进行target>nums[mid-1]判断时,如果mid为0, mid-1就为-1
//会造成subscript out range的错误,因此需要先判断mid是否为边界
{
Index = mid;
}
end = mid - 1;
}
else if (target>nums[mid])
{
if (mid == nums.size() - 1||target<nums[mid+1])
//注意此处不能写为if ((target<nums[mid+1])||(mid == nums.size() - 1))。因为先进行target<nums[mid+1]判断时,如果mid为nums.size()-1, mid+1就为nums.size()
//会造成subscript out range的错误,因此需要先判断mid是否为边界
{
Index = mid + 1;
}
begin = mid + 1;
}
}
return Index;
}
};
int main()
{
int test[] = {1,3,5,6};
std::vector<int> nums;
Solution solve;
for ( int i = 0; i < 4; i++)
{
nums.push_back(test[i]);
}
for (int i = 0; i < 8; i++)
{
printf("i=%d index=%d\n",i,solve.searchInsert(nums,i));
}
return 0;
}
运行结果为:
i=0 index=0
i=1 index=0
i=2 index=1
i=3 index=1
i=4 index=2
i=5 index=2
i=6 index=3
i=7 index=4