当前位置: 首页 > news >正文

【力扣刷题实战】搜索插入位置

大家好,我是小卡皮巴拉

文章目录

目录

力扣题目:搜索插入位置

题目描述

解题思路

问题理解

算法选择

具体思路

解题要点

完整代码(C++)

兄弟们共勉 !!! 


每篇前言

博客主页:小卡皮巴拉

咱的口号:🌹小比特,大梦想🌹

作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请大佬们批评斧正。

力扣题目:搜索插入位置

原题链接:35. 搜索插入位置 - 力扣(LeetCode)

题目描述

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

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

示例 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

解题思路

问题理解

本题要求在一个已排序的数组 nums 中查找目标值 target,若找到则返回其索引;若未找到,则返回目标值按顺序插入数组时应处的位置。并且要求算法的时间复杂度为 O(logn)。

算法选择

采用二分查找算法。二分查找是一种高效的查找算法,适用于有序数组,它通过不断将搜索区间缩小一半,从而将时间复杂度控制在 O(logn)。

具体思路

  1. 初始化左右指针

    • 定义两个指针 left 和 right,分别指向数组的起始位置(索引为 0)和结束位置(索引为 nums.size() - 1)。

  2. 二分查找过程

    • 使用 while 循环,当 left < right 时,执行以下操作:

      • 计算中间位置 mid,为避免整数溢出,使用 mid = left + (right - left) / 2 计算。

      • 比较 nums[mid] 和 target 的大小:

        • 如果 nums[mid] < target,说明目标值在 mid 的右侧,将 left 更新为 mid + 1

        • 如果 nums[mid] >= target,说明目标值可能在 mid 或其左侧,将 right 更新为 mid

  3. 最终结果判断

    • 当 left 和 right 相遇时,循环结束。此时判断 nums[left] 和 target 的大小:

      • 如果 nums[left] < target,说明目标值应插入到 left 的下一个位置,返回 left + 1

      • 否则,说明目标值应插入到 left 位置,返回 left

解题要点

  1. 二分查找的实现:正确计算中间位置 mid,并根据 nums[mid] 和 target 的大小关系更新左右指针,确保每次迭代都能将搜索区间缩小一半。

  2. 最终位置的判断:循环结束后,根据 nums[left] 和 target 的大小关系确定目标值的插入位置。

完整代码(C++)

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) 
    {
        int left = 0, right = nums.size() - 1; // 初始化左右指针,分别指向数组的起始和结束位置

        while (left < right) // 当左指针小于右指针时,继续二分查找
        {
            int mid = left + (right - left) / 2; // 计算中间位置,避免整数溢出

            if (nums[mid] < target) // 如果中间元素小于目标值
                left = mid + 1; // 目标值在 mid 的右侧,更新左指针
            else
                right = mid; // 目标值可能在 mid 或其左侧,更新右指针
        }

        if (nums[left] < target) // 循环结束后,判断目标值的插入位置
            return left + 1; // 如果当前位置元素小于目标值,插入到下一个位置
        return left; // 否则,插入到当前位置
    }
};

兄弟们共勉 !!! 

码字不易,求个三连

抱拳了兄弟们!

相关文章:

  • 用API解锁大模型超能力——从零构建智能体到本地知识库全链路解析
  • FFmpeg6.1.1 MSYS2+GCC 源码编译
  • 在C++ Qt中集成Halcon窗口并实现跨平台兼容和大图加载
  • 手敲NLP相关神经网络,熟悉神经网络的结构与实现!
  • 数据类设计_图片类设计之9_图标类设计_C++实战_(前端架构)
  • 插值查找和斐波那契查找
  • 金桔网桥连载5-详解
  • pikachu靶场实战记录
  • OrangePi 5B 内核开启 CONFIG_CIFS 通过 Samba 挂载 NAS 路径
  • 文件上传绕过的小点总结(3)
  • C++效率掌握之STL库:stack queue函数全解
  • C++ 利用类模板实现一个数组类封装
  • 《数字图像处理》第三章 3.7 混合空间增强法笔记:原理、实现与Python实战
  • 【赵渝强老师】达梦数据库的物理存储结构
  • 使用Langchain4J整合springboot+流式数据响应示例
  • # Ubuntu 软件包管理:apt、snap 和 Flatpak 如何选择
  • GitHub 上的 Khoj 项目:打造你的专属 AI 第二大脑
  • MySQL 的索引类型有哪些?应该怎么选择?
  • React - LineChart组件编写(用于查看每日流水图表)
  • AI日报 - 2025年3月25日
  • 国际上首次,地月空间卫星激光测距试验在白天成功实施
  • 溢价率19.48%,民企番禺置业3.07亿元竞得广州番禺融媒体中心北侧地块
  • 新闻分析:电影关税能“让好莱坞再次伟大”?
  • 我给狗狗上课,月赚四五万
  • 五一当天1372对新人在沪喜结连理,涉外婚姻登记全市铺开
  • 《水饺皇后》领跑五一档票房,《哪吒2》上座率仍居第一