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

文章目录

题目

方法一:二分查找(先找到mid,在根据mid确定左右区间)

  1. 第一步先找到target所在的位置mid
  2. 在根据mid 在数组左右分两个while循环找左右区间,一旦nums[mid] != target,就返回mid值
  3. 最后查找位置会停在区间外的一个位置,需要矫正回来
java 复制代码
// 方法一 :二分法找目标元素的位置,然后在目标元素的位置的左右找左右区间
    public int[] searchRange(int[] nums, int target) {
        if(nums.length == 0) return new int[]{-1,-1};
        int mid = search( nums,  target);//二分法找target位置
        if(mid == -1) return new int[]{-1,-1};//若没有  直接返回 - 1  - 1
        int m = mid;
        while(m < nums.length){//根据mid 去找右区间最大下标
                if(nums[m] != target) break;
                 m ++;
        }
        int n = mid;
        while(n >=0){//根据mid 去找左区间最小下标
                if(nums[n] != target) break;
                   n--;
        }
        return new int[]{n+1,m-1};//最终m其实是在右区间后面一个位置停止的  m需要-1  同理最终实是在左区间前面一个位置停止的,n需要+1
    }
    //二分法找目标元素  目标元素不存在返回 - 1
    public int search(int[] nums, int target){
        int left = 0 ;
        int right = nums.length - 1 ;
       while(left <= right){
        int mid = (right - left)/2 + left;
        if(nums[mid] == target) return mid;
        if(nums[mid] > target) right = mid -1;
        if(nums[mid] < target) left = mid +1;
       }
    return -1;
    }

方法二:分两次二分查找,一次用于找左区间,一次用于找右区间

一定要结合画图来理解

java 复制代码
// 方法二 :二分法来去寻找左右边界
    public int[] searchRange(int[] nums, int target) {
        if(nums.length == 0) return new int[]{-1,-1};
        int left = leftjoin(nums,target);
        int right = rightjoin(nums,target);
          // 情况一
        if (left == -2 || right == -2) return new int[]{-1, -1};
        // 情况三
        if (right - left > 1) return new int[]{left + 1, right - 1};
        // 情况二
        return new int[]{-1, -1};

}

    //寻找左边界
    public int leftjoin(int[] nums, int target){
        int left = 0;
        int right = nums.length -1;
        int leftjoin = -2;//记录左边界的赋值情况
        while(left <= right){
            int mid = left + (right -left);
            if(nums[mid] >= target){
                right = mid -1;
                leftjoin = right;
            }else {
                left = mid + 1;
            }
        }
        return leftjoin;
    }
   //寻找右边界
    public int rightjoin(int[] nums, int target){
        int left = 0;
        int right = nums.length -1;
        int rightjoin = -2;//记录左边界的赋值情况
        while(left <= right){
            int mid = left + (right -left);
            if(nums[mid] > target){
                   right = mid -1;
            }else {
             left = mid + 1;
             rightjoin = left;
            }
        }
        return rightjoin;
    }

参考题解:34. 在排序数组中查找元素的第一个和最后一个位置

相关推荐
pianmian110 分钟前
python数据结构基础(7)
数据结构·算法
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
ChoSeitaku3 小时前
链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)
数据结构·考研·链表
偷心编程3 小时前
双向链表专题
数据结构
香菜大丸3 小时前
链表的归并排序
数据结构·算法·链表
jrrz08283 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time3 小时前
golang学习2
算法
@小博的博客4 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生4 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法