70 搜索插入位置

搜索插入位置

    • [题解1 二分查找](#题解1 二分查找)
    • [题解2 STL大法](#题解2 STL大法)

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

请必须使用时间复杂度为 O ( l o g n ) O(log n) O(logn)的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5

输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2

输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7

输出: 4

提示:

  • 1 <= nums.length <= 1 0 4 10^4 104
  • − 1 0 4 -10^4 −104 <= nums[i] <= 1 0 4 10^4 104
  • nums无重复元素升序 排列数组
  • − 1 0 4 -10^4 −104 <= target <= 1 0 4 10^4 104

题解1 二分查找

cpp 复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int len = nums.size();
        int left = 0;
        int right = len-1;
        int pos = 0;
        while(left <= right){
            int mid = (left+right) >> 1;
            if(nums[mid] == target) return mid;
            else if(nums[mid] < target){
                left = mid+1;
                // left就是升序情况下 应该插入的位置
                pos = left;
            }else{
                right = mid-1;
            }
        }
        return pos;
    }
};


防越界写法

cpp 复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0, right = n - 1, ans = n;
        while (left <= right) {
            int mid = ((right - left) >> 1) + left;
            if (target <= nums[mid]) {
            // mid = left + (difference)>>1 (Key: 找到第一个下标,对应值 >= target)
                ans = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return ans;
    }
};

题解2 STL大法

cpp 复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        auto it = find(nums.begin(),nums.end(),target);
        if(it!=nums.end()){
            return it-nums.begin();
        }
        auto first =lower_bound(nums.begin(), nums.end(), target);
        return first-nums.begin();
    }
};

两行

cpp 复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        auto st = nums.cbegin(), ed = nums.cend();
        return lower_bound(st, ed, target) - st;
    }
};
相关推荐
阳明山水8 分钟前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
桐盛科技40 分钟前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算
wuyk55541 分钟前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
-dzk-44 分钟前
【链表】LC 138.随机链表的复制
数据结构·链表
Tongzhi20261 小时前
通芝科技考勤软件三大发展趋势:AI大模型、无感识别与数据底座
大数据·科技·算法·爬山算法
eBest数字化转型方案1 小时前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
洋不写bug2 小时前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现
residual_fan2 小时前
持续对比强化学习(Continual Contrastive Reinforcement Learning)论文分享
人工智能·算法·数据挖掘·数据分析
s_w.h2 小时前
【 计网 】序列化与反序列化
linux·服务器·网络·算法·bash
信奥卷王2 小时前
2025年09月GESPC++五级真题解析(含视频)
算法