题目:
所谓双调查找 : 就是在一个数组中的所有元素是先递增后递减的,则这个数组被称为双调的。
以a数组为例 :{1,2,3,5,8,9,6,4,-1,-9};
思路:
1. 既然是有序的,自然想到的是二分搜索
2. 但是与普通的二分搜索不一样,不知道拐点在何处
3. 所以大致分为三种情况:
① a[mid] 在 左半边但未越过拐点
② a[mid] 在右半边越过了拐点
③ a[mid]刚好在拐点
所以可以分为以上三种情况进行递归查找
1.代码如下 Shuangdiao .java:
package com.yuhl.right;
import sun.java2d.pipe.SpanClipRenderer;
public class Shuangdiao {
public static void main(String[] args) {
int [] arr = {1,2,3,5,8,9,6,4,-1,-9};
int index = specialBinarySearch(arr, 0, 10, 9);
System.out.println(index);
}
public static int specialBinarySearch(int [] a,int start,int end,int target) {
if(start <= end) {
int mid = start + (end - start) / 2;
if(a[mid] == target)
return mid;
int status = -1;
status = checkStatus(a,start,end);
if(a[mid] > target) {
if(status == 3) {
int index = -1;
index = binarySearchAscend(a,start,mid-1,target);
if(index != -1)
return index;
return binarySearchDescend(a,mid+1,end,target);
}
else if(status == 2) {
int index = -1;
index = specialBinarySearch(a,start,mid-1,target);
if(index != -1)
return index;
return binarySearchDescend(a,mid+1,end,target);
}
else if(status == 1) {
int index = -1;
index = binarySearchAscend(a,start,mid-1,target);
if(index != -1)
return index;
return specialBinarySearch(a,mid+1,end,target);
}
else
return -1;
}
else {
if(status == 3)
return -1;
else if(status == 2)
return specialBinarySearch(a,start,mid-1,target);
else if(status == 1)
return specialBinarySearch(a,mid+1,end,target);
else
return -1;
}
}
return -1;
}
public static int checkStatus(int [] a,int start,int end) {
int index = start + (end - start) / 2;
if(a[index-1] < a[index] && a[index] > a[index+1])
return 3;
else if(a[index-1] > a[index] && a[index] > a[index+1])
return 2;
else if(a[index-1] < a[index] && a[index] <a[index+1])
return 1;
else
return -1;
}
public static int binarySearchAscend(int [] a,int start,int end,int target) {
if(start <= end) {
int mid = start + (end - start) / 2;
if(a[mid] == target)
return mid;
else if(a[mid] > target)
return binarySearchAscend(a,start,mid-1,target);
return binarySearchAscend(a,mid+1,end,target);
}
return -1;
}
public static int binarySearchDescend(int [] a,int start,int end,int target) {
if(start <= end) {
int mid = start + (end - start) / 2;
if(a[mid] == target)
return mid;
else if(a[mid] > target)
return binarySearchDescend(a,mid+1,end,target);
return binarySearchDescend(a,start,mid-1,target);
}
return -1;
}
}
2.执行结果:
"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe"
5