
本体还是对旋转后的有序数组进行查找操作。因为要找的是最小值,我们可以根据计算出来的nums[mid]值与nums[left]、nums[right]来进行比较,决定搜索范围的上下界做出何种修改。
class Solution {
public int findMin(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
// 数组本身就是有序排列的
if (nums[left] <= nums[mid] && nums[right] >= nums[mid]) {
return nums[left];
}
// 数组的左半边[0,mid]是有序的,右半边[mid+1, nums.length-1]无序
// 因为 nums[mid]比nums[left]大,所以找最小值,mid可以不用算进去
// 但是如果时右边有序的情况,nums[mid]比nums[right]小,nums[mid]可能时最小值,不能被排除
if (nums[left] <= nums[mid]) {
left = mid + 1;
} else if (nums[mid] <= nums[right]){ // 左半边无序,右半边有序
right = mid;
}
}
return nums[left];
}
}
另一种解法(只比较mid和right)
class Solution {
public int findMin(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[right]) {
left = mid + 1;
} else if (nums[mid] < nums[right]) {
right = mid;
}
}
return nums[left];
}
};
如果想深入了解可以看leetcode题解:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/solution/er-fen-cha-zhao-wei-shi-yao-zuo-you-bu-dui-cheng-z/