万事开头难
题目提示为无重复元素的升序数组,可以考虑二分法
方法一:暴力解法
int searchInsert(int* nums, int numsSize, int target){
int i = 0;
for(;i<numsSize;i++){ //遍历数组
if(nums[i] >= target) //四种情况 1.最小,下标为0. 2.最大,下标为numSize
return i; //3.有相等的值,返回下标i 4.target在两个数之间
}
return numsSize; //target为最大,排在数组最后
}
主要是用来感受二分法的区间定义
题解里面的画解算法的图特别棒
左闭右闭:
int searchInsert(int* nums, int numsSize, int target){
int left = 0;
int right = numsSize - 1;
int mid = 0;
while(left <= right){ //定义区间为[left,right]
mid = left + (right - left) / 2;
if(target < nums[mid]) //在左区间
right = mid - 1;
else if(target > nums[mid]) //在右区间
left = mid + 1;
else //target == nums[mid]
return mid;
}
//数组中未找到target元素
//target在数组所有元素之后,[left, right]是右闭区间,需要返回 right +1
return right + 1;
}
左闭又开
int searchInsert(int* nums, int numsSize, int target){
int left = 0;
int right = numsSize;
int mid = 0;
while(left < right){ //定义区间为[left,right]
mid = left + (right - left) / 2;
if(target < nums[mid]) //在左区间
right = mid;
else if(target > nums[mid]) //在右区间
left = mid + 1;
else //target == nums[mid]
return mid;
}
//数组中未找到target元素
//target在数组所有元素之后,[left, right]是右闭区间,需要返回 right +1
return right;
}