这道题的思路是直接找旋转数组中的最小值
目标是通过移动左指针让左指针到达最小值
情况讨论:
情况1:num[left]<num[middle],最小值一定不在这里,所以去middle+1~right找
情况2:num[left]>num[middle],最小值一定在这里,所以去left~middle里找
情况3:num[left]==num[middle],指针重合,这个时候最小值一定是left+1(详见边界问题分析)
代码如下
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];
}
边界问题分析:
A=[9,1] A[left]=9, A[right]=1, A[middle]=9, 最小值是1
1. 如果left指针和middle指针重合且A[left]>A[right],此时A[right]才是需要的答案,left应该指向left+1才对。
2. while(left<right)
如果left指针和right指针重合,此时应该跳出循环,直接返回A[left],因为这个时候已经找到最小值。
3. right=middle
因为这里不会出现找不到最小值的情况,所以不会出现死循环。