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

在这里插入图片描述

    public int[] searchRange(int[] nums, int target) {


        int [] num = new int[2];
        //数组为空的情况
        if (nums.length==0){
            num[0] = -1;
            num[1] = -1;
            return num;

        }
        //二分查找到对应查找的元素,如果没有则返回-1
        int flag =  commonBinarySearch(nums,target);
        //在数组中查找不到元素
        if (flag == -1) {
            num[0] = -1;
            num[1] = -1;
            return num;
        }
        //设置两个指针,指向这个相同元素的头尾
          int head = flag;
          int rear = flag;
          //当到达边界退出
          while (head!=0){
//              如果和前一个元素相等,则还需要移动head向前
              if (nums[head-1]==nums[head]){
                  head --;
              }else {
//                  与前一个元素不相等,找到该元素的最左边界
                  break;
              }

          }
          
        //当到达边界退出
        while (rear!=nums.length-1){
//              如果和候一个元素相等,则还需要移动rear向前
            if (nums[rear]==nums[rear+1]){
                rear ++;
            }else {
//                  与前一个元素不相等,找到该元素的最右边界
                break;
            }

        }
         num[0] = head;
         num[1] = rear;

        return num;
    }

    public static int commonBinarySearch(int[] arr,int key) {
        int low = 0;
        int high = arr.length - 1;
        int middle = 0;            //定义middle

        if (key < arr[low] || key > arr[high] || low > high) {
            return -1;
        }

        while (low <= high) {
            middle = (low + high) / 2;
            if (arr[middle] > key) {
                //比关键字大则关键字在左区域
                high = middle - 1;
            } else if (arr[middle] < key) {
                //比关键字小则关键字在右区域
                low = middle + 1;
            } else {
                return middle;
            }
        }

        return -1;        //最后仍然没有找到,则返回-1

        }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值