题目: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.
此题是I的扩展,有序数组部分元素置于数组后半部,数字可能重复,例如【1,1,1,0,1】,考虑使用二分查找的变形
- 如果mid>=left,说明min在mid的右边(包含mid)→_→
- 如果mid<=right,说明min在mid的左边(包含mid)☜
特例:【1,1,1,0,1】与【1,0,1,1,1】left=mid=right这种情况,无法使用上述条件寻找,只能通过遍历来寻找最小值
public class Solution {
public int findMin(int[] nums) {
if(nums == null || nums.length==0)
return -1;
int l=0,r=nums.length-1,mid=(l+r)/2;
while(l<=r && l>=0 && r<nums.length){
if(r-l ==1 || nums[l] < nums[r]) return Math.min(nums[l], nums[r]); //终止
//如果存在[1,1,1,0,1]这种情况不能用二分法判断,只能遍历
if(nums[mid] == nums[l] && nums[mid] == nums[r]){//必须放在下面两个if条件之前
int min=nums[0];
for(int i=l;i<=r;i++)
min=Math.min(min, nums[i]);
return min;
}
if(nums[mid] >= nums[l])
l=mid;
if(nums[mid] <= nums[r])
r=mid;
mid=(l+r)/2;
}
return nums[mid];
}
}