使用BinarySearch查找元素的第一次和最后一次出现

问题描述

我可以有效地找到第一个匹配项,但是找不到最后一个匹配项。对于元素的最后一次出现,我得到的答案始终是正确的索引加一个

这是我的代码

class FirstAndLastOccurence{

    public static int first(int[] arr,int n,int x){
        int left = 0;
        int right = n-1;
        int res = -1;

        while(left <= right){
            int mid = left + (right-left)/2;

            if(x < arr[mid])
                right = mid-1;
            if(x > arr[mid])
                left = mid+1;
            else{
                res = mid;
                right = mid-1;
            }
        }

        return res;
    }

    public static int last(int[] arr,int x){
        int left = 0;
        int right = n-1;
        int res = -1;

        while(left <= right){
            int mid = left + (right-left)/2;
            
            if(x < arr[mid])
                right = mid-1;
            if(x > arr[mid])
                left = mid+1;
            else{
                res = mid;
                left = mid+1;
            }
        }

        return res;
    }

    public static void main(String[] args){
        int[] arr = new int[]{2,4,10,56,71,90};
        System.out.println(first(arr,arr.length,10));
        System.out.println(last(arr,10));
    }
}

输出

2
6

一个输出正确,而最后一个输出错误,应该是5。我要遵循的代码here代码不完全相同,我正在实现以我个人更熟悉的方式进行二进制搜索)。

解决方法

您在最后一个语句中同时添加了if语句和else语句,仅对不正确的第二个if语句执行。请找到下面的有效代码并给出正确答案。

public static int last(int[] arr,int n,int x){
    int left = 0;
    int right = n-1;
    int res = -1;

    while(left <= right){
        int mid = left + (right-left)/2;

        if(x < arr[mid])
            right = mid-1;
        else if(x > arr[mid])
            left = mid+1;
        else{
            res = mid;
            left = mid+1;
        }
    }

    return res;
}