【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. 在排序数组中查找元素的第一个和最后一个位置

相关推荐
然我7 分钟前
链表指针玩不转?从基础到双指针,JS 实战带你破局
前端·数据结构·算法
EndingCoder16 分钟前
算法与前端的可访问性
前端·算法·递归·树形结构
ysa05103042 分钟前
竞赛常用加速技巧#模板
c++·笔记·算法
7 971 小时前
C语言基础知识--文件的顺序读写与随机读写
java·数据结构·算法
2401_841003981 小时前
Kubernetes 资源管理全解析
算法·贪心算法
☆璇2 小时前
【数据结构】排序
c语言·开发语言·数据结构·算法·排序算法
艾莉丝努力练剑5 小时前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
_殊途6 小时前
《Java HashMap底层原理全解析(源码+性能+面试)》
java·数据结构·算法
珊瑚里的鱼10 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
秋说11 小时前
【PTA数据结构 | C语言版】顺序队列的3个操作
c语言·数据结构·算法