二分查找
//n表示A的大小,A是有序数组且不包含重复元素
public int getPos(int[] A,int n,int val){
if(n==0||A==null)
return -1;
int left=0;
int right=n-1;
int mid;
while(right>=left){
mid=left+(right-left)/2;
if(A[mid]==val)
return mid;
if(A[mid]>val)
right=mid-1; //mid左一个,很重要,当不存在时,会导致循环条件不满足跳出循环
if(A[mid]<val)
left=mid+1;
}
return -1;
}
当数组中出现了相同数字时,返回该值第一次出现的位置
public static int getPos(int[] A,int n,int val){
if(n==0||A==null)
return -1;
int left=0;
int right=n-1;
int mid;
while(right>left){
mid=(right+left)/2;
if(A[mid]>val)
right=mid-1;
else if(A[mid]<val)
left=mid+1;
/*
* 当mid的值和val相等时,因为要返回最先出现的那个,所以让right=mid,
* 这样再判断,当mid前面的中间值还是相等的值(有序),right就会继续往前,
* 移到前面相等的位置。当前面不相等,left就会往后移,
* 一直移到与right重合,此时 就可以跳出循环
*/
else
right=mid;
}
if(A[left]==val) return left;
return -1;
}
ps:听说可以发表情