1.题目介绍
2.题解
2.1 二分查找(递归实现)
思路
利用递归+二分查找实现对于目标数target索引位置(存在)或者插入位置的索引(不存在)
1.递归返回条件:
left > right,在通过二分法寻找到最接近target的值nums[mid]依旧不等于target,也就是left == right的情况依旧不满足,说明数组中并不存在target,应选择插入
按道理来说target的索引应存在于[left,right]的范围内,但如果出现left > right,说明数组中不存在target,插入位置选择如下:
1.1 这时候如果该 nums[mid(此时mid = left = right)] < target , 走[mid + 1(left + 1 = right + 1), right],相当于在left + 1上插入,
left是整个数组中小于target数中最接近target的,下一个就是大于target的或者不存在了,所以插入在left + 1上是合理的。
1.2 这时候如果该 nums[mid(此时mid = left = right)] > target , 走[left, mid - 1],相当于在left上插入
left是整个数组中大于target数中最接近target的,上一个就是小于target的或者不存在了,所以插入在left上是合理的。
2.这里使用 int mid = left + (right - left) / 2; 而不是直接 /2,是避免left + right 过大造成溢出。
3.下面的三段if判断就是一般二分递归查找的步骤了
代码
class Solution {
public:
int getIndex(vector<int>& nums, int left, int right, int target) {
if (left > right) {
return left; // 找到插入位置
}
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
return getIndex(nums, mid + 1, right, target);
} else {
return getIndex(nums, left, mid - 1, target);
}
}
int searchInsert(vector<int>& nums, int target) {
return getIndex(nums, 0, nums.size() - 1, target);
}
};
2.2 二分查找(迭代)
思路
迭代的思路非常简单,如代码:
代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n = nums.size();
int left = 0, right = n - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == target) return mid;
else if(nums[mid] > target) right = mid - 1;
else left = mid + 1;
}
return left;
}
};
标签:right,target,nums,int,mid,35,插入,搜索,left
From: https://www.cnblogs.com/trmbh12/p/17990809