//LeftMost
public void testApp7() {
int arr[] = {1,2,4, 4, 4, 5, 6,7, 8, 9};
//查找目标
int target = 4;
//初始化左右边界
int i=0,j=arr.length-1;
int candidate=-1;//候选值
//初始化中间值
while (i<=j){
//设中间值索引
int m=(i+j)>>>1;
if(target>arr[m]){
i=m+1;//目标大于中间数,排除左边查找范围
}else if (target<arr[m]){
j=m-1;//目标小于中间数,排除右边范围
}else{
candidate=m;//命中则加入候选
j=m-1;//继续向左查找
//i=m+1;//继续向右查找(RightMost)
}
}
//输出结果
System.out.println("最终值为:"+candidate);
}
这里的思路是:先定义一个候选变量,每次符合条件就迭代这个候选变量,如果要向左找最左边的就继续j=m-1,同理,最右就i=m+1
其实还有一种写法:
不定义候选变量,后面不是要处理j=m-1/i=m+1吗,索性最后就输出j+1,i-1都是一样的,我看很多视频还专门拎出来讲解一番,简直侮辱人的智商