题目
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
你可以假设数组中不存在重复元素。
示例 1:
输入: [3,4,5,1,2]
输出: 1
示例 2:
输入: [4,5,6,7,0,1,2]
输出: 0
链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array
解题思路
此题关键还是看二分的条件,其实该向哪边寻找一直是二分查找的关键。
本题中涉及旋转数组,所以直接排除正常数组,因为正常数组中nums[0]即为最小数。
在旋转数组中,被旋转前的首节点即为最小数字,那么旋转后的最小数字必然满足特征:前一个数字>本数字<后一个数字.
该向哪个方向寻找:
- 当 nums[mid] > nums[left]时,最小数字一定在mid的右侧。
- 当 nums[mid] < nums[left]时,最小数字一定在mid的左侧。
当某个方向的值只剩两个时,可以用三目运算符直接返回结果。
代码
class Solution {
public int findMin(int[] nums) {
int left = 0;
int right = nums.length -1;
if (nums[left] <= nums[right]) return nums[left];
while (left <= right){
if (nums[left] <= nums[right]) return nums[left];
if (right - left == 1) return nums[right]>nums[left]?nums[left]:nums[right];
int mid = left + (right - left)/2;
if (nums[mid -1] > nums[mid] && nums[mid] < nums[mid +1]) return nums[mid];
if (nums[left] < nums[mid]){
left = mid +1;
}else{
right = mid - 1;
}
}
return -1;
}
}