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;
    }
};
posted @   DawnTraveler  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示