题解 | #旋转数组的最小数字#
旋转数组的最小数字
http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba
思路一、 java方法实现,通过set的无法存储重复值得特性,然后通过TreeSet的排序特性进行获取最小值。 代码实现:
Set<Integer>set=new TreeSet<>();
for (int i=0;i<array.length;i++){
set.add(array[i]);
}
Object[] a = set.toArray();
return (int) a[0];
}
这种思路虽然能解决问题,但是这样结果的话显然没有利用到旋转数组这一特性。下面是用二分法,利用旋转数组的特性解决问题的思路。
int end=array.length-1;
while (start<end){
int mid=(start+end)/2;
//如果坐标位mid的值小于最后一个值,则最小的值就可能位mid前面的值或者mid本身,这时候就可使end=mid;
if (array[mid]<array[end]){
end=mid;
}else if (array[mid]>array[end]){//如果坐标mid的值大于最有一个值,那么最小的值显然要在当前值的前面。
start=mid+1;
}else{//如果相等的话,就说明最小值在坐标位end的值的前面。
end=end-1;
}
}
return array[start];