如何解决使用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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。