6、搜索插入位置

厨子大约 3 分钟数据结构算法算法基地面试二分查找数组插入位置刷题程序厨校招社招

题目描述

搜索插入位置open in new window

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

示例 1:

输入: [1,3,5,6], 5 输出: 2

示例 2:

输入: [1,3,5,6], 2 输出: 1

示例 3:

输入: [1,3,5,6], 7 输出: 4

示例 4:

输入: [1,3,5,6], 0 输出: 0

题目解析

这个题目完全就和咱们的二分查找一样,只不过有了一点改写,那就是将咱们的返回值改成了 left,具体实现过程见下图

搜索插入位置
搜索插入位置

题目代码

Java Code:

class Solution {
    public int searchInsert(int[] nums, int target) {

        int left = 0, right = nums.length-1;
        //注意循环条件
        while (left <= right) {
            //求mid
            int mid = left + ((right - left ) >> 1);
            //查询成功
            if (target == nums[mid]) {
                return mid;
            //右区间
            } else if (nums[mid] < target) {
                left = mid + 1;
            //左区间
            } else if (nums[mid] > target) {
                right = mid - 1;
            }
        }
        //返回插入位置
        return left;
    }
}

C++ Code:

#include <vector>
using namespace std;

class Solution {
public:
    // 在有序数组中查找目标值,返回其索引或应插入的位置
    int searchInsert(const vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        
        // 二分查找循环
        while (left <= right) {
            // 计算中间索引,避免整数溢出
            int mid = left + ((right - left) >> 1);
            
            if (target == nums[mid]) {
                return mid;  // 找到目标值,返回其索引
            } else if (nums[mid] < target) {
                // 目标值在右半区间,移动左指针
                left = mid + 1;
            } else if (nums[mid] > target) {
                // 目标值在左半区间,移动右指针
                right = mid - 1;
            }
        }
        
        // 未找到目标值,返回应插入的位置
        return left;
    }
};