博客
关于我
leetcode题解34-在排序数组中查找元素的第一个和最后一个位置
阅读量:790 次
发布时间:2023-01-31

本文共 1436 字,大约阅读时间需要 4 分钟。

好的,我将以您提供的方式来重新优化文章内容。


我也很好奇,这个问题该怎么解决呢?所以我决定仔细思考一下。给定一个已经按升序排列的整数数组 nums 和一个目标值 target,任务是找出目标值在数组中的开始位置和结束位置。如果数组中不存在目标值,则返回 [-1, -1]

方法一:线性搜索法

首先,我想到了最简单的线性搜索方法。这种方法的思路是逐个检查数组中的每一个元素。具体步骤如下:

  • 从数组的开始位置开始遍历。
  • 在找到第一个等于目标值的元素时,记录此时的索引 left 和继续向前移动到下一个元素。
  • 然后继续移动到下一个元素,重复步骤2,直到找到最后一个等于目标值的元素。
  • 最终,left 将记录第一个出现的位置,而最后一个出现的位置在上一步骤中已经确定。
  • 例如,对于 nums = [5,7,7,8,8,10] 而言,目标 target = 8,第一次搜索找到索引3是第一个8。然后继续搜索,找到索引4是最后一个8,因此返回 [3,4]

    这种方法的时间复杂度是 O(n),其中 n 是数组的长度。适用于小规模数据,但对于大规模数据,效率可能较低。

    方法二:二分查找法

    接下来,我想到了可以通过二分查找来优化性能。因为数组已经排序,所以可以利用二分查找来快速定位目标值。为了找到目标值的起始和结束位置,需要进行两次二分查找。

    第一次二分查找:找第一个出现的目标值

  • 初始化搜索范围为整个数组,左指针 left 设为0,右指针 right 设为数组的长度 - 1。
  • 计算中间指针 mid,如果 nums[mid] 等于目标值,则记录当前 mid 为可能的起始位置,并将右指针更新为 mid,继续向左查找以确定是否有更早的起始位置。
  • 否则,如果 nums[mid] 大于目标值,则目标值在左边子数组,右指针更新为 mid - 1
  • 重复上述步骤,直到找到第一个等于目标值的元素或者确定目标值不存在。
  • 例如,还是上面的数组,第一次二分查找找到第一个8的位置为索引3。

    第二次二分查找:找最后一个出现的目标值

  • 重置左指针 left 为0,右指针 right 设为数组的长度 - 1。
  • 计算中间指针 mid,如果 nums[mid] 等于目标值,则记录当前 mid 为可能的结束位置,并将左指针更新为 mid + 1,继续向右查找以确定是否有更晚的结束位置。
  • 否则,如果 nums[mid] 小于目标值,则目标值在右边子数组,左指针更新为 mid + 1
  • 重复上述步骤,直到找到最后一个等于目标值的元素或者确定目标值不存在。
  • 这样,通过两次二分查找,可以在 O(log n) 时间内找到目标值的起始和结束位置。

    示例分析

    示例1

    输入:nums = [5,7,7,8,8,10], target = 8

    • 第一次二分查找:找到索引3是第一个8。
    • 第二次二分查找:找到索引4是最后一个8。
    • 输出:[3, 4]

    示例2

    输入:nums = [5,7,7,8,8,10], target = 6

    • 由于数组中没有6,两次二分查找后都未找到,返回 [-1, -1]。

    示例3

    输入:nums = [], target = 0

    • 数组为空,直接返回 [-1, -1]。

    总结

    通过上述两种方法,可以有效地解决问题。线性搜索法简单易实现,但对于大数组效率较低;而二分查找法能够显著提升性能,达到 O(log n) 时间复杂度,是更优的选择。根据实际需求选择合适的方法,以达到最佳的性能和效率。

    转载地址:http://fegyk.baihongyu.com/

    你可能感兴趣的文章
    Elasticsearch 之(16)_filter执行原理深度剖析(bitset机制与caching机制)
    查看>>
    Elasticsearch7.3.1启动指定JDK11
    查看>>
    Elasticsearch下载安装
    查看>>
    Elasticsearch入门教程(Elasticsearch7,linux)
    查看>>
    ElasticSearch设置字段的keyword属性
    查看>>
    elasticsearch配置文件里的一些坑 [Failed to load settings from [elasticsearch.yml]]
    查看>>
    Elasticsearch面试题
    查看>>
    element ui 时间日期选择器 el-date-picker 报错 Prop being mutated “placement“
    查看>>
    element 如何使用自定义icon图标
    查看>>
    element-plus的el-date-picker日期范围选择控件,根据开始日期限定结束日期的可选范围为开始日期到开始日期+30天
    查看>>
    element-ui:el-input输入数字-整数和小数
    查看>>
    ElementUI-el-progress改变进度条颜色跟文字样式
    查看>>
    elTable火狐浏览器换行
    查看>>
    15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    2024年全国程序员平均薪资排名:同样是程序员,为什么差这么多?零基础到精通,收藏这篇就够了
    查看>>
    0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏)
    查看>>
    10个程序员可以接私活的平台
    查看>>
    10个运维拿来就用的 Shell 脚本,用了才知道有多爽,零基础入门到精通,收藏这一篇就够了
    查看>>
    10款最佳免费WiFi黑客工具(附传送门)零基础入门到精通,收藏这一篇就够了
    查看>>
    15个备受欢迎的嵌入式GUI库,从零基础到精通,收藏这篇就够了!
    查看>>