题意:找出旋转数组的最小值。例如,3,4,5,1,2是1,2,3,4,5的一个旋转数组。
思路:采用二分查找的方式可以获得O(log(n))的时间复杂度,但是这里需要注意几地方,第一,循环的中止;第二,当begin、last和mid的值都相等的时候,怎么处理。
代码:
package MianShiTi_8;
public class MianShiTi_8 {
public static int findMinChar(int[] numbers){
if(numbers == null || numbers.length <= 0){
return 0;
}
if(numbers.length == 1){
return numbers[0];
}
int begin = 0;
int last = numbers.length-1;
int mid = begin;
//while循环条件
while (numbers[begin] >= numbers[last]) {
//last-begin = 1,说明两个数相邻,这个时候last所代表的即是最小值。
if(last - begin == 1){
mid = last;
break;
}
mid = (begin +last)/2;
//三个数相等,只能通过顺序查找的方式来。
if(numbers[begin] == numbers [last] && numbers[mid] == numbers[last]){
return findMinChara_2(numbers);
}
if(numbers[mid] > numbers[begin]){
begin = mid;
}
if(numbers[mid] < numbers[begin]){
last = mid;
}
}
return numbers[mid];
}
public static int findMinChara_2(int[] numbers) {
int begin = 0;
int last = numbers.length -1;
int min = numbers[begin];
for(int i = begin+1 ; i<numbers.length; i++){
if(numbers[i] < min){
min = numbers[i];
}
}
return min;
}
public static void main(String[] args) {
int[] numbers ={1,0,1,1,1};
System.out.println(new MianShiTi_8().findMinChar(numbers));
}
}