Medium, 用时20分钟
出现了两处错误:
1.处理duplicates的方法没问题,仅需考虑尾部的duplicates即可,从而划归为153题(no duplicates)。
2.在去除尾部duplicates后需要再去除corner case(error1), 否则[1,2,1]无法test成功(去除duplicates后会出现顺序情况)
3.error2,bs的条件不能让pivot与nums[begin]相比,应该与nums[0]。
public class Solution {
public int findMin(int[] nums) {
//9:07
//Eliminate some corner cases!
int length = nums.length;
if(length == 1) return nums[0];
if(length == 2) return Math.min(nums[0], nums[1]);
if(nums[0] < nums[length - 1]) return nums[0];
int begin = 0, end = length-1;
//remove duplicates in the tail!
while (nums[end] == nums[0] && end > 0) {
end --;
}
if(end == 0) return nums[0];
//this is necessary(error1)
if(nums[0] < nums[end]) return nums[0];
while (begin < end) {
int mid = (begin + end) / 2;
int pivot = nums[mid];
//必须是nums[0],不能是nums[begin]!与不同的bs不同(error2)
if(pivot >= nums[0]) begin = mid + 1;
else end = mid;
}
return nums[begin];
}
}