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[low ...hight]
如果 num[low] < num[hight] ,那么数组就是已经有序的了 直接返回num[low]
如果num[low] > num[hight] ,也是说数组被打乱了,那么 数组的形态可以是这样子的
a情况: 8,9,0 , 1, 2 , 3 , 4 ,5 ,6,7 或者 b情况 2 , 3 , 4 ,5 ,6, 7 ,8, 9, 0,1
对于 mid = (low + hight) / 2 = 4, a情况落在了数字2上面,显然 2 < num[low]时候 最小值落在low和mid之间,而且
数字2有可能是最小值
b情况 落在了数字6上面,6 > num[low]也就说 最小值落在了 low 和mid 之间,而且num[mid] 不能是最小值,因为
存在num[low] 比6还小
代码如下:
public class Solution {
public int findMin(int[] num) {
int low = 0, hight = num.length - 1;
while(hight - low >= 2){
int mid = (low + hight) / 2;
if(num[low] < num[hight]){
return num[low];
}
else if(num[mid] > num[low]){
low = mid + 1;
}
else{
hight = mid;
}
}
int minVal = Integer.MAX_VALUE;
for(int i = low; i <= hight; ++i){
if(num[i] < minVal){
minVal = num[i];
}
}
return minVal;
}
}