博客
关于我
【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 函数随笔 map()函数,lambda自定义函数
    查看>>
    Python 分析天气,告诉你中秋应该去哪里
    查看>>
    python 列表中dict中key排序
    查看>>
    python 列表函数
    查看>>
    Python 列表删除相同的元素
    查看>>
    python 列表生成式
    查看>>
    Python 列表解析 大文件
    查看>>
    python 列表转字典方法
    查看>>
    Python 列表(List)概述-ChatGPT4o作答
    查看>>
    Python网络爬虫基础进阶到实战教程
    查看>>
    Python 初学者需要知道的四条建议
    查看>>
    Python 判断字符串是否包含子字符串
    查看>>
    python 判断当前时间是否为零点
    查看>>
    python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
    查看>>
    python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
    查看>>
    python 利用pyttsx3文字转语音
    查看>>
    python 利用已有Ner模型进行数据清洗合并
    查看>>
    python 到大数据开发工程师_如何成为一个大数据开发工程师?
    查看>>
    python 加密解密(base64, AES)
    查看>>
    Python 包管理器和 Node.js
    查看>>