求先升后降数列的最大值
适用范围:先升后降数组或单调递增数组
二分检索
非递归
public static int binarygetMax(int[] A) {
if (A == null){
return -1;
}
int left = 0;
int right = A.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (A[mid] > A[mid + 1]) right = mid;
else if (A[mid] < A[mid + 1]) left = mid + 1;
else {
if (A[left] > A[right]) right--;
else left++;
}
}
return A[left];
}
递归
public static int binarygetMaxone(int[] A,int left,int right) {
if (A == null){
return -1;
}
/*
递归算法一定要有递归出口,否则会提示堆栈溢出错误
Exception in thread "main" java.lang.StackOverflowError 错误
递归出口对应非递归循环的外部循环条件,下面的if-else对应循环中的各种情况
*/
if(left >= right) {
return A[left];
}
int mid = left + (right - left) / 2;
if(A[mid] > A[mid + 1])
return binarygetMaxone(A,left,mid);
else if (A[mid] < A[mid + 1])
return binarygetMaxone(A,mid+1,right);
else {
if(A[left] > A[right])
binarygetMaxone(A,left,right--);
else
binarygetMaxone(A,left+1,right);
}
return A[left];
}
三分检索
非递归
public static int trisection_searchMax(int[] A){
if (A == null){
return -1;
}
int left = 0;
int right = A.length-1;
while (left < right ){
int midl = left + (right - left)/3;
int midr = right - (right - left)/3;
if (A[midl] > A[midr]){
right = midr - 1;
}else{
left = midl + 1;
}
}
return A[left];
}
递归
public static int trisection_searchMaxone(int[] A,int left,int right){
if (A == null){
return -1;
}
if(left >= right) {
return A[left];
}
int midl = left + (right - left)/3;
int midr = right - (right - left)/3;
if (A[midl] > A[midr]){
return trisection_searchMaxone(A,left,midr-1);
}else{
return trisection_searchMaxone(A,midl+1,right);
}
}
主函数以及结果: