思路:
不管旋转多少次,在旋转点两侧都是有序的,其中旋转点就是最小值。所以只要找到旋转值就是目标值。可以通过二分方式寻找。从0-N-1上寻找。如果L的值小于R的值说从L到R上递增,那么L就是旋转点。返回。反之就求出mid=L+(R-L)/2 目的防止整数溢出。 如果L到mid是递减的,那么旋转点就是在右侧,继续递归寻找。反之在左侧寻找。代码如下:
class Solution {
public int findMin(int[] nums) {
if (nums == null || nums.length == 0) {
return Integer.MAX_VALUE; // 或抛出异常,因为输入无效
}
return process(nums, 0, nums.length - 1);
}
private int process(int[] nums, int L, int R) {
// 如果子数组是有序的,那么最小值就是子数组的第一个元素
if (nums[L] <= nums[R]) {
return nums[L];
}
int mid = L + (R - L) / 2;
// 比较中间元素与两侧元素,确定旋转点的位置
if (nums[mid] >= nums[L]) {
// 旋转点在右侧
return process(nums, mid + 1, R);
} else {
// 旋转点在左侧,包括mid
return process(nums, L, mid);
}
}
}