• LeetCode220803_70、在排序数组中查找元素的第一个和最后一个位置


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

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

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

    示例 1:

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

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题解、数组有序,用二分法查找,时间复杂度O(log n)

    特殊情况数组长度为0,直接返回。

    第一个为target的数值即用nums[mid]>= target,看是否有相等,有的话即为第一个等于target的数值

    找target的左边界,让他落在nums[mid]左侧作为首选条件,可将范围分割为两部分,确定是否包含左边界。

    ①如果target位于nums[mid]的左边(nums[mid] >= target),再次搜索时可向左推进,right = mid;

    ②如果target位于nums[mid]的右侧(nums[mid] < target),说明左边界得向右推移,left = mid+ 1。

    ③若最终返回值不为target,直接返回[-1, -1];

    第末个为target的数值急用nums[mid]<= targe,前一个若有相等,此时这个必有,即可返回。

    找target的右边界,让他落在nums[mid]右则作为首选条件,之后else分析另一侧。

    ①如果target位于nums[mid]的右边(nums[mid]<= target),说明左边界向右推进,left = mid;

    ②如果target位于nums[mid]的左边(nums[mid] > target),更新右边界搜索target,right = mid -1。

    1. class Solution{
    2. public int[] searchRange(int[] nums, int target){
    3. int len = nums.length;
    4. if(len == 0) return new int[]{-1, -1};
    5. int left = 0, right = len - 1;
    6. while(left < right){
    7. int mid = left + (right - left) / 2;
    8. if(nums[mid] >= target){
    9. right = mid;
    10. }else{
    11. left = mid + 1;
    12. }
    13. }
    14. if(nums[right] != target) return new int[]{-1, -1};
    15. int L = right;
    16. left = 0;
    17. right = len - 1;
    18. while(left < right){
    19. int mid = left + (right - left + 1) / 2;
    20. if(nums[mid] <= target){
    21. left = mid;
    22. }else{
    23. right = mid - 1;
    24. }
    25. }
    26. return new int[]{L, right};
    27. }
    28. }

  • 相关阅读:
    挂脖式运动蓝牙耳机推荐,目前适合运动佩戴的五款耳机推荐
    [管理与领导-105]:IT人看清职场中的隐性规则 - 2 - 刷存在感也是管理工作的一部分, 是展现自身和团队价值的一种手段
    前端必备:Node.js是什么?它有哪些特点和优势?
    Rust借用几种变化情况分析
    Doris代码结构
    TatukGIS Developer Kernel使用教程:如何为FMX创建第一个应用程序
    Arduino IDE的下载和安装
    10、Java——吃货联盟订餐系统(基础知识)
    SSM学校社团管理系统
    vscode Markdown使用
  • 原文地址:https://blog.csdn.net/Zoro_666/article/details/126149562