这道题的思路是直接找旋转数组中的最小值,但是允许出现重复元素的情况
目标依然是通过移动左指针让左指针到达最小值
情况讨论:
情况1:num[left]<num[middle],最小值一定不在这里,所以去middle+1~right找
情况2:num[left]>num[middle],最小值一定在这里,所以去left~middle里找
情况3:num[left]==num[middle],这个时候无法比较,只有通过移动左指针直到可以比较为止。
比如[10,10,10,1,10]
只有一直移动左指针直到左指针指向1才能比较
所以最坏情况时间复杂度是O(N)
public int findMin(int[] num) {
int left = 0;
int right = num.length - 1;
while (left < right) {
if (num[left] < num[right])
return num[left];
int middle = (left + right) / 2;
if (num[left] < num[middle])
left = middle + 1;
else if (num[left] > num[middle])
right = middle;
else
left++;
}
return num[left];
}