Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
Find the minimum element.
You may assume no duplicate exists in the array.
主要思想是二分查找,对于num[beg .. end]数组,命mid=(beg+end)/2,那么存在一下三种情况:
1)num[beg]<num[end]: 这时,整个数组是有序的,因此直接返回num[beg]即可;
2)num[beg]>=num[end] && num[beg]>num[mid]:这时,num[mid..end]有序,那么最小值一定出现在num[beg..mid]之中,抛弃num[mid+1..end];
3)num[mid]>=num[end] && num[beg]<=num[mid] : 这时,num[beg..mid]是有序的,所以最小值一点个出现在num[mid+1..end]中,因为至少num[end]是小于num[beg]的,抛弃num[beg..mid];
public class Solution { public int findMin(int[] num){ int len = num.length; int beg = 0; int end = len-1; while(beg<end){ //all sorted if(num[end]>=num[beg]){ break; } int mid = (beg+end)/2; //Sorted from mid to end //The smallest must in num[beg..mid] if(num[mid]<num[beg]){ end = mid; } else{ //Sorted from beg to mid //The smallest must in num[mid+1..end] beg = mid+1; } } return num[beg]; } }
Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?Would this affect the run-time complexity? How and why?
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
Find the minimum element.
The array may contain duplicates.
For case where AL == AM == AR, the minimum could be on AM’s left or right side (eg, [1, 1, 1, 0, 1] or [1, 0, 1, 1, 1]). In this case, we could not discard either subarrays and therefore such worst case degenerates to the order of O(n).
public int findMin(int[] A) { int L = 0, R = A.length - 1; while (L < R && A[L] >= A[R]) { int M = (L + R) / 2; if (A[M] > A[R]) { L = M + 1; } else if (A[M] < A[L]) { R = M; } else { // A[L] == A[M] == A[R] L = L + 1; } } return A[L]; }
我的代码如下:
public class Solution { public int findMin(int[] num){ int len = num.length; int beg = 0; int end = len-1; while(beg<end){ //all sorted if(num[end]==num[beg]){ beg++; continue; } if(num[end]>num[beg]){ break; } int mid = (beg+end)/2; //Sorted from mid to end //The smallest must in num[beg..mid] if(num[mid]<num[beg]){ end = mid; } else{ //Sorted from beg to mid //The smallest must in num[mid+1..end] beg = mid+1; } } return num[beg]; } }