博客
关于我
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/

    你可能感兴趣的文章
    LeetCode110.平衡二叉树
    查看>>
    LeetCode111.二叉树最小深度
    查看>>
    LeetCode114.二叉树展开为链表[后序遍历典例]
    查看>>
    LeetCode136.只出现一次的数字[异或运算典例]
    查看>>
    LeetCode13:罗马数字转整数
    查看>>
    leetcode190-颠倒二进制位
    查看>>
    leetcode191-打家劫舍
    查看>>
    leetcode23-合并K个升序链表
    查看>>
    leetcode231 判断一个给定的整数是否是2的n次幂
    查看>>
    leetcode238-除自身以外数组的乘积
    查看>>
    LeetCode268.缺失数字
    查看>>
    LeetCode331.验证二叉树的前序序列化
    查看>>
    LeetCode502
    查看>>
    leetcode507
    查看>>
    Leetcode: Spiral Matrix II
    查看>>
    LeetCode: String to Integer (atoi)
    查看>>
    Leetcode:454. 4Sum II
    查看>>
    leetcode:Minimum Depth of Binary Tree【Python版】
    查看>>
    LeetCode:Restore IP Addresses
    查看>>
    LeetCode_Lowest Common Ancestor of a Binary Search Tree (Binary Tree)
    查看>>