这道题刚开始看到,以为O(n)的复杂度肯定通不过,拖了两天,报着试试看的态度,直接把O(n)复杂度的代码粘了进去,这.....竟然通过了!!!
感觉还是太low了,后来用二分查找做了一下,代码如下
public class FindMinimuminRotatedSortedArray {
//O(n)很好写
public int findMin(int[] nums) {
int min = nums[0];
for(int i = 1;i < nums.length;i ++){
if(nums[i] < min){
min = nums[i];
}
}
return min;
}
//O(logn) 变种的二分查找法,判断条件变了
public int findMinI(int[] nums) {
int len = nums.length;
if (len == 1)
return nums[0];
int left = 0, right = len - 1;
while (nums[left] > nums[right]) { // good idea
int mid = (left + right) / 2;
if (nums[mid] > nums[right]) {
left = mid + 1;
}
else {
right = mid; // be careful, not mid-1, as num[mid] maybe the minimum
}
}
return nums[left];
}
//O(logn)
public int findMinII(int[] nums) {
return findMinHelp(nums, 0, nums.length - 1);
}
private int findMinHelp(int[] nums,int begin,int end){
if(nums[begin] <= nums[end]){
return nums[begin];
}
int mid = begin + (end - begin) / 2;
if(nums[mid] < nums[end]){
return findMinHelp(nums, begin, mid);
}
//nums[mid] > nums[end] 则nums[mid]肯定不为最小值,所以mid + 1
return findMinHelp(nums,mid + 1,end);
}
}