35. 搜索插入位置(点击查看原题)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
解题思路
1.给定的是排序数组,而且要求找到目标值,自然而然就想到了折半查找(二分查找)。
2.若查找不到则按顺序插入在数组中,这个可以使用简单的for循环,找到第一个比目标值target大的值i,将target插入在i的位置上;可能会有target大于数组所有的值的可能,所以再加上一个判断是否大于数组最大值的条件。
实现代码
int searchInsert(int* nums, int numsSize, int target){
int left,right,mid;
left = 0; //定义最左下标为记录首位
right = numsSize-1; //定义最右下标为记录末位
while(left<=right) //最左下标小于或等于最右下标
{
mid = (left+right)/2; //折半,mid为中间下标
if(nums[mid]>target) //若查找值比中值小
{
right = mid-1; //最右下标调整到中位下标小一位
}
else if(nums[mid]<target) //若查找值比中值大
{
left = mid+1; //最左下标调整到中位下标大一位
}
else if(nums[mid]=target) //相等则返回mid
{
return mid;
}
}
int i; //若查找不到,则寻找可插入位置
for(i=0;i<numsSize;i++) //从数组0下标位置开始查找
{
if(target<nums[i]) //若查找值小于nums[i]则可插入在i这个位置上,将原i值整体向后移动一位
{
return i;
}
if(target>nums[numsSize-1]) //若查找值大于数组最大值(numsSize-1为数组最后一位)
{
return numsSize; //插入在最后,就是numsSize-1+1 = numsSize
}
}
return 0;
}