35. 搜索插入位置
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;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了