1、问题概述:给一个有序数组A和一个目标值T,在A中找到T,返回索引,如果T不在A中,则按顺序插入位置
2、示例
示例 1:
输入: nums = [1,3,5,6], target = 5 输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2 输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7 输出: 4
3、分析
解法1:根据 示例 3得出,当目标值超出该数组的最大元素时,返回该数组的长度,
所以当目标值<=数组元素时,直接返回索引
解法2:该题是有序数组,可以利用二分查找来解
(1)定义3个变量 left=0 right=数组长度-1 middle=(left+right)/2 `
(2)目标元素>中间元素,右边不变,左边:left=middle+1
(3)目标元素<中间元素,左边不变,右边:right=middle-1
(4)二分法向下取整,最终比较返回left
4、代码
方法1:直接遍历O(n)
int searchInsert(int* nums, int numsSize, int target) {
for(int i=0;i<numsSize;i++){
// 如果目标值小于数组中的元素值,返回当前的索引
if(nums[i]>=target) return i;
}
// 针对与超出数组的情况,直接放在最后,返回数组长度
return numsSize;
}
方法2:二分查找(只针对有序序列)
int searchInsert(int* nums, int numsSize, int target) {
int left=0;
int right=numsSize-1;
int middle;
while(right>=left){
middle=(left+right)/2;
if(nums[middle]==target){
return middle;
}
if(nums[middle]<target){
left=middle+1;
}
if(nums[middle]>target){
right=middle-1;
}
}
// 二分向下取整,所以去left
return left;
}