写点什么

每日一题:LeetCode-34. 在排序数组中查找元素的第一个和最后一个位置

作者:半亩房顶
  • 2023-12-18
    北京
  • 本文字数:1141 字

    阅读完需:约 4 分钟

刷题使我快乐,满脸开心.jpg


题目

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。


如果数组中不存在目标值 target,返回 [-1, -1]


你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。


示例 1:


输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]
复制代码


示例 2:


输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]
复制代码


示例 3:


输入:nums = [], target = 0输出:[-1,-1]
复制代码


提示:


  • 0 <= nums.length <= 105

  • -109 <= nums[i] <= 109

  • nums 是一个非递减数组

  • -109 <= target <= 109

思路

首先是一个理解问题,其实题目中非递减顺序想表达的是,给出的数据会是一个只有递增和持平两种趋势的数组。这个对写答案影响很大。


知道这个的话,其实问题就比较简单了,再加上时间复杂度O(log n)提示。直接二分法就好了。寻找到目标值之后,第一个和最后一个只要往左和往右尝试移动下就好~


至此,上代码

代码

func searchRange(nums []int, target int) []int {    left, right, n := 0, len(nums) - 1, len(nums)    targetLeft, targetRight := -1, -1    // 特殊情况罗列,快速得到答案    if n == 0 || nums[left] > target || nums[right] < target {        return []int{targetLeft, targetRight}    } else if nums[left] == target {        targetLeft, targetRight = left, left    } else if nums[right] == target {        targetLeft, targetRight = right, right    }    // 一般情况处理,二分法寻找目标    for left < right {        mid := (left + right) / 2        if nums[mid] == target {            targetLeft, targetRight = mid, mid            break        } else if nums[mid] < target {            left = mid + 1        } else {            right = mid        }    }    // 利用数据特点,寻找第一个目标    for targetLeft > 0 {        if ((targetLeft - 1) >= 0) && (nums[targetLeft - 1] == target) {            targetLeft = targetLeft - 1        } else {            break        }    }    // 利用数据特点,寻找最后一个目标    for targetRight < (n - 1) && targetRight != -1 {        if ((targetRight + 1) <= (n - 1)) && (nums[targetRight + 1] == target) {            targetRight = targetRight + 1        } else {            break        }    }    return []int{targetLeft, targetRight}}
复制代码




欢迎关注公众号查看更多题目~


发布于: 刚刚阅读数: 5
用户头像

半亩房顶

关注

人生那么长,能写多少bug? 2018-11-16 加入

我希望,自己永远是自己。我希望,远离bug。

评论

发布
暂无评论
每日一题:LeetCode-34. 在排序数组中查找元素的第一个和最后一个位置_Go_半亩房顶_InfoQ写作社区