输入:一个递增序列的一个旋转
输出:旋转数组的最小元素
eg:{3,4,5,1,2}是{1,2,3,4,5}的旋转
思路:双指针法,取中间元素,如果大于第一个指针所指的元素,将该指针指向中间元素,小于第二个指针所指的元素,将第二个指针指向中间元素。最终第一个指针和第二个指针会指向两个相邻的元素,第二个指针所指即为所求
特殊情况是,中间值和两个指针指向的元素一致时,要从两个指针间用顺序查找的方法得到最小值
eg:{1,0,1,1,1}是{0,1,1,1,1}的旋转
public class MinNumber {
// 找出旋转数字的最小数字(剑指offer第8题);
public void min(int[] array){
if(array == null || array.length == 0){
return;
}
int start = 0;
int end = array.length - 1;
while(start < end){
if(end - start == 1){
break;
}
int mid = (start + end)/2;
//如果下标start,end,mid指向的三个数字相等,采用顺序查找的办法
if(array[start] == array[end] && array[start] == array[mid]){
minInOrder(array,start,end);
return;
}
if(array[mid] >= array[start]){
start = mid;
}else if(array[mid] <= array[end]){
end = mid;
}
}
System.out.print(array[end]);
}
private void minInOrder(int[] array, int start, int end) {
int result = array[start];
for(int i = start+1; i <= end; i ++){
if(result > array[i]){
result = array[i];
}
}
System.out.print(result);
}
public static void main(String[] args){
int[] example = {1,0,1,1,1};
new MinNumber().min(example);
}
}