博客
关于我
【LeetCode(Java) - 34】在排序数组中查找元素的第一个和最后一个位置
阅读量:57 次
发布时间:2019-02-25

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

解决数组中目标值范围问题

问题描述

我们需要找到一个数组 nums 中的目标值 target 的范围,即找到 target 的第一个和最后一个出现位置。如果 target 不在数组中,返回一个空数组。


解题思路

我们可以定义一个辅助方法 extremeInsertionIndex,用于查找目标值 target 在数组中的开始位置或结束位置。这个方法有两个参数:

  • left 参数为 true 时,返回目标值的开始位置;
  • false 时返回目标值的结束位置。

查找开始位置的逻辑

  • 初始化边界:

    • 左边界 lo 设为 0;
    • 右边界 hi 设为数组长度。
  • 使用二分查找法:

    • 计算中间值 mid
    • 如果 nums[mid] 大于目标值,说明目标值在左边界,更新右边界 himid
    • 如果 nums[mid] 等于目标值,可能 mid 就是开始位置,更新右边界 himid
    • 当边界闭合时,返回左边界 lo
  • 查找结束位置的逻辑

  • 同样初始化边界 lohi
    • 如果 nums[mid] 大于目标值,更新右边界 himid
    • 如果 nums[mid] 等于目标值,更新左边界 lomid + 1
    • 返回右边界 hi 并减 1。

  • 解题代码

    class Solution {    private int extremeInsertionIndex(int[] nums, int target, boolean left) {        int lo = 0, hi = nums.length;        while (lo < hi) {            int mid = lo + (hi - lo) / 2;            if (nums[mid] > target || (left && target == nums[mid])) {                hi = mid;            } else {                lo = mid + 1;            }        }        return lo;    }    public int[] searchRange(int[] nums, int target) {        int[] result = {-1, -1};        int leftIdx = extremeInsertionIndex(nums, target, true);        if (leftIdx == nums.length || nums[leftIdx] != target) {            return result;        }        result[0] = leftIdx;        result[1] = extremeInsertionIndex(nums, target, false) - 1;        return result;    }}

    代码解释

  • 辅助方法 extremeInsertionIndex

    • 根据 left 参数判断查找方向;
    • 使用二分查找法缩小查找范围,找到目标值的边界位置。
  • 主方法 searchRange

    • 初始化结果数组为 -1
    • 调用 extremeInsertionIndex查找左边界;
    • 检查左边界是否有效,若无效则返回空数组;
    • 再次调用查找右边界,并调整为 rightEnd - 1
    • 返回目标值的范围。
  • 通过这种方法,我们可以高效地找到目标值在数组中的范围,时间复杂度为 O(log n)。

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

    你可能感兴趣的文章
    Python Selenium实现自动化测试及Chrome驱动使用!
    查看>>
    Python Selenium搭建UI自动化测试框架
    查看>>
    Python Selenium模块详解
    查看>>
    Python selenium爬取影评生成词云图
    查看>>
    python selenium自动化测试报告
    查看>>
    Python selenium自动化测试框架实战 —— 登录测试案例
    查看>>
    Python Selenium设计模式 —— POM
    查看>>
    Python Serial:如何使用 read 或 readline 函数一次读取多个字符
    查看>>
    Python set([]) 如何检查两个对象是否相等?一个对象需要定义哪些方法来自定义它?
    查看>>
    Python setup.py:数据文件无法复制目录:不存在或不是常规文件
    查看>>
    Python setuptools sdist:仅安装版本化文件
    查看>>
    Python Shell下使用matplotlib
    查看>>
    Python Slice How-to,我知道Python Slice,但我怎么才能使用内置的Slice对象呢?
    查看>>
    python socket分包发送数据
    查看>>
    python socket模块_Python socket模块实现TCP服务端客户端
    查看>>
    Python SOCKS5代理客户端HTTPS
    查看>>
    Python Soc网络分析:通过使用函数迭代列表来计算机会网络
    查看>>
    python转换已转义的字符串
    查看>>
    Python Sphinx自动摘要:成员函数的自动列表
    查看>>
    Python SQL和NoSQL数据库操作实战
    查看>>