剑指Offer 11
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:
旋转之后形成两个排序子数组,并且最小的元素是两子数组的分界线。可以用二分查找的方式去查找。
我们可以用两个指针来指向数组的第一个元素和最后一个元素。接着我们可以找到数组中间的数,如果数组位于前面的递增数组中,我们可以将第一个指针指向中间的元素,从而缩小搜索范围。如果数组位于后面的递增数组中,我们可以将第二个数组指向中间元素,缩小搜索范围。接下来用更新的指针重复做新一轮的查找。
特殊情况:1)输入数组长度为零 2)两指针和中间的数组相等时,只能顺序查找
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { if (array == null || array.length == 0){ return 0; } int start = 0; int end = array.length - 1; int index = 0; while (array[start] >= array[end]){ if (end - start <= 1){ return array[end]; } int middle = (start + end) / 2; if (array[middle] == array[start] && array[middle] == array[end]){ return findOrder(array, start, end); } if (array[middle] >= array[start]){ start = middle; index = start; } if (array[middle] <= array[end]){ end = middle; } } return array[index]; } public int findOrder(int array[], int start, int end){ int min = array[start]; for (int i = 0; i <= end; i++){ if (array[i] < min){ min = array[i]; } } return min; } }

浙公网安备 33010602011771号