题目
1.描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
2.示例
输入: [3,4,5,1,2]
输出: 1
3.思路
使用二分查找的思想,首先对只有一个元素和旋转下标为0的情况进行考虑 , 然后用中间元素和第一个元素进行比较
- 中间元素大于第一个元素, 在右半部分找最小值
- 中间元素小于第一个元素, 在左半部分找最小值
- 结束条件, left<=right:
- 中间元素大于右侧相邻元素, 则右侧相邻元素为最小值
- 中间元素小于左侧相邻元素, 当前中间元素即为最小值
- 条件均不满足返回-1
4.代码
public int findMin(int[] nums) {
if (nums.length == 1)
return nums[0];
int left = 0, right = nums.length - 1;
if (nums[right] > nums[0])
return nums[0];
while (right >= left) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[mid + 1])
return nums[mid + 1];
if (nums[mid - 1] > nums[mid])
return nums[mid];
if (nums[mid] > nums[0])
left = mid + 1;
else
right = mid - 1;
}
return -1;
}