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

    你可能感兴趣的文章
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>
    Nginx的使用总结(一)
    查看>>
    Nginx的可视化神器nginx-gui的下载配置和使用
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx运维与实战(二)-Https配置
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置——不记录指定文件类型日志
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>