题目:
An array is bitonic if it is comprised of an increasing sequence of integers followed immediately by a decreasing sequence of integers. Write a program that, given a bitonic array of N distinct int values, determines whether a given integer is in the array. Your program should use ~3lg N compares in the worst case.
思路:
1、按照二分查找;
2、确认mid的值是处在递增序列还是递减序列,或者是中间点;
3、如果是在递增序列,target > arry[mid],那么可以去除mid左边的数据,直接递归在右边的双调数组中查找,否则需要在左边部分进行递增数组查找;
4、如果是在递减序列,target < arry[mid],那么可以在mid左边的部分进行双调数组查找,否则还需要在右半部份进行递减数组二分查找;
5、如果mid恰好是分界点,那么在左右数组分别进行递增数组和递减数组二分查找;
代码:
package com.frozenxia.algorithm.basic.exercises;
public class Bitonicsearch {
public int search(int[] arry, int target) {
int start = 0;
int end = arry.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (arry[mid] == target) {
return mid;
} else if ((mid - 1) >= 0 && (arry[mid - 1] > arry[mid])) {
if (arry[mid] > target) {
int cr = decreasing_search(arry, mid + 1, end, target);
if (cr != -1)
return cr;
}
end = mid - 1;
} else if (mid + 1 < arry.length && arry[mid + 1] > arry[mid]) {
if (arry[mid] > target) {
int cr = increasing_search(arry, start, mid - 1, target);
if (cr != -1)
return cr;
}
start = mid + 1;
} else if (mid == 0) {
start = mid + 1;
} else if (mid == arry.length - 1) {
end = mid - 1;
} else {
int cr = increasing_search(arry, start, mid - 1, target);
if (cr != -1)
return cr;
cr = decreasing_search(arry, mid + 1, end, target);
if (cr != -1)
return cr;
return -1;
}
}
return -1;
}
public int increasing_search(int[] arry, int start, int end, int target) {
// System.out.println("increasoing");
while (start <= end) {
int mid = (start + end) / 2;
if (arry[mid] == target)
return mid;
if (arry[mid] < target) {
start = mid + 1;
} else {
end = mid - 1;
}
}
return -1;
}
public int decreasing_search(int[] arry, int start, int end, int target) {
while (start <= end) {
int mid = (start + end) / 2;
if (arry[mid] == target)
return mid;
if (arry[mid] > target) {
start = mid + 1;
} else {
end = mid - 1;
}
}
return -1;
}
public static void main(String[] args) {
int[] arry = { 12, 14, 17, 18, 19, 16, 15, 13, 12, 8, 7, 6, 5, 4 };
Bitonicsearch bs = new Bitonicsearch();
System.out.println(bs.search(arry, 125 ));
for (int i : arry) {
System.out.println(bs.search(arry, i));
}
}
}