题目:
把一个数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转。
输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1
思路:二分查找
取两个指针low和high分别指向arr的第一个值和最后一个值,mid=low + (high - low)/2,将原数组看为两个递增数组,且左边数组的所有值大于右边数组所有制
当array[low] >= arr[high],考虑三种情况:
(1)arr[mid] > arr[low]
则mid一定在数组1中,令low=mid
(2)arr[mid] < arr[high]
则mid一定在数组2中,令high=mid
(3)当arr[low] = arr[high] = arr[mid]
遍历法找最小值,如{1,1,1,0,1}
当high-low == 1时,找到最小值为arr[high]
代码实现:
public class Sixth { public static int returnMin(int[] arr){ if(arr.length == 0){ return 0; } int low = 0; int high = arr.length - 1; int min = 0; int mid = 0; while(arr[low] >= arr[high]){ if(high - low == 1){ min = arr[high]; break; } mid = low + (high - low) / 2; if(arr[low] == arr[mid] && arr[mid] == arr[high]){ min = sortArray(arr); break; } if(arr[mid] > arr[low]){ low = mid; } if(arr[mid] < arr[high]){ high = mid; } } return min; } public static int sortArray(int[] array){ int min = array[0]; for(int i = 0; i < array.length; i ++){ if(array[i] < min){ min = array[i]; } } return min; } public static void main(String[] args){ int[] arr = {1,1,1,0,1}; System.out.println(returnMin(arr)); } }