假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。
请找出其中最小的元素。
注意数组中可能存在重复的元素。
示例 1:
输入: [1,3,5] 输出: 1
class Solution {
public int findMin(int[] nums) {
return findMin1(nums, 0, nums.length - 1);
}
public int findMin1(int[] nums, int low, int high) {
int mid = 0;
while (low < high) {
if (nums[low] < nums[high]) {
return nums[low];
}
mid = (low + high) / 2;
if (nums[low] < nums[mid]) { //[low, mid]有序
low = mid + 1;
} else if (nums[mid] < nums[low]) { //[mid, high] 有序
high = mid;
} else { //nums[low] == nums[mid]
if (nums[mid] == nums[high]) {
//考虑重复元素 [10, 10, 10, 10, 1, 10]
int x = Integer.MAX_VALUE, y = Integer.MAX_VALUE;
if ((mid + 1) <= high) {
x = findMin1(nums, mid + 1, high);
}
if ((mid - 1) >= low) {
y = findMin1(nums, low, mid - 1);
}
return x > y ? y : x;
} else {
low = mid + 1;
}
}
}
return nums[low];
}
}
写的不好,请大家多多指教