问题:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:
1.思考可能的输入:
(1)正常的递增数组:形如 1 , 2 , 3 ,4
(2)全是相等数字的数组:形如 2 ,2 , 2 ,2
(3)存在相等数字的数组:形如 1 , 2 , 2 ,2
2.因为旋转而导致最终数组表现为两个递增数组的堆叠,答案就在下一个数组的起始位置,因为数字的排列有一定的规律性所以可以采用二分法来进行求解
接下来我们用个例子来说明一下:
代码:
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int[] array) { if (array.length == 0){ return 0; } int i = 0, j = array.length - 1; while (i < j) { if (array[i] < array[j]) { return array[i]; //如果数组首尾递增,那么说明数组没有移动,直接返回第一个数字即可 } int mid = (i + j) >> 1; if (array[mid] > array[i]) { i = mid + 1; } else if (array[mid] < array[j]) { j = mid; // 如果是mid-1,则可能会错过最小值,错例形如(5,6,3,4,4),减一可能会直接导致查找范围错误 } else i++; // 巧妙避免了坑点(2 1 2 2 2) } return array[i]; } }