题意:找出旋转数组的最小值。例如,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)); } }