题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的 旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如 数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所 有元素都大于0,若数组大小为0,请返回-1。假设数组中不存在重复元素。
思路:利用二分法,找到数组的中间元素mid。如果中间元素>数组第一个元素, 在mid右边搜索变化点。如果中间元素<数组第一个元素,我们需要在mid左边 搜索变化点。当找到变化点时停止搜索,满足nums[mid]>nums[mid+1] (mid+1是最小值)或nums[mid-1]>nums[mid](mid是最小值)即可。
package Function;
//利用二分法,找到数组的中间元素mid。如果中间元素>数组第一个元素, 在mid右边搜索变化点。
// 如果中间元素<数组第一个元素,我们需要在mid左边 搜索变化点。
// 当找到变化点时停止搜索,
// 满足nums[mid]>nums[mid+1] (mid+1是最小值)
// 或nums[mid-1]>nums[mid](mid是最小值)即可。
//:二分查找(找变化点),时间复杂度:O(logn),空间复杂度:O(1)
public class minInReversingList11 {
public static int minInReversingList(int[] array) {
if (array == null || array.length == 0) {
return -1;
}
if (array.length == 1 || array[array.length - 1] > array[0]) { return array[0]; }
int left = 0;
int right = array.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
//如果中间元素>数组第一个元素, 在mid右边搜索变化点。
if (array[mid] > array[mid + 1]) {
return array[mid + 1];
}
//如果中间元素<数组第一个元素,我们需要在mid左边 搜索变化点
if (array[mid - 1] > array[mid]) {
return array[mid];
}
//满足nums[mid]>nums[mid+1] (mid+1是最小值)
// 或nums[mid-1]>nums[mid](mid是最小值)即可
if (array[mid] > array[0]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
public static void main(String[] args) {
int []arr1=new int[]{1,1,1,0,1};
int[]arr2={1,0,1,1,1};
minInReversingList11 p=new minInReversingList11();
int b=p.minInReversingList(arr2);
System.out.println(b);
}
}