题目描述
对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
测试样例:
[1,3,5,7,9],5,3
返回:1
<分析>:
1.题目没给出数组是升序还是降序,故需要判断是升序还是降序
2.需要返回查找元素第一次出现的位置,那么当找到时,需要判断是否是第一次出现
package com.ex.string;
/**
*
* @author zy
* @date 2017年10月18日 下午2:59:23
* @Decription 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
* 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。
* 若该元素出现多次,请返回第一次出现的位置。
*/
public class Ex10 {
public int getPos(int[] A, int n, int val) {
// write code here
if (A==null || n==0) {
return -1;
}
int low=0;
int high=n;
//升序
if (A[0]<A[n-1]) {
while(low<=high){
int mid=(low+high)/2;
if (A[mid]==val) {
return findFirstPos(A, val, mid);
}else if (A[mid]>val) {
high = mid-1;
}else {
low = mid+1;
}
}
}
//降序
if (A[0]>A[n-1]) {
while(low<=high){
int mid=(low+high)/2;
if (A[mid]==val) {
return findFirstPos(A, val, mid);
}else if (A[mid]>val) {
low=mid+1;
}else {
high=mid+1;
}
}
}
return -1;
}
private int findFirstPos(int[] A,int val,int position){
while(position>=0 && A[position]==val){
position--;
}
return position+1;
}
}