题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路
简单题,不用思路
解答
java 版
方法一:暴力求解
public int minNumberInRotateArray(int [] array) {
if(array.length==0){
return 0;
}
int min = 10000;
for(int i = array.length-1;i>=0;i--){
min = min<array[i]?min:array[i];
}
return min;
}
显然,如果你用这样的代码去面试,你多半要GG。我们对此代码稍加优化。
方法二 稍加优化
public int minNumberInRotateArray(int [] array) {
if(array.length==0){
return 0;
}
int size = array.length-1;
for(int i = 0;i<size;i++){
if(array[i]>array[i+1])
{
return array[i+1];
}
}
return array[size];
}
这样 比前面的代码确实是优化了一点,但是效果并不是我们理想中的代码。所以我们还要优化,有注意到我们的的数组是有序的。
方法三
public int minNumberInRotateArray(int [] array) {
if(array.length==0){
return 0;
}
int high = array.length-1;
int low = 0;
int mid = low+(high-low)/2;
while(low<high){
if(array[low]<array[high]) return array[low];
mid = low+(high-low)/2;
if(array[mid]>array[high]){
low = mid+1;
}else if(array[mid]<array[high])
{
high = mid;
}else{
high --;
}
}
return array[low] ;
}
中间值得一提的是,当 array[mid]<array[high]时,high 不能等于 mid ,因为如果我们查找的范围只剩两个了{4,6}
我们 mid 必定指向{4} 如果 此时 ,high = mid-1;答案就错误了。
php 版
方法一
function minNumberInRotateArray($rotateArray)
{
return min($rotateArray);
}
显然,hr 考你这道题,不是让你用自带的函数的啊。你这样绝壁 pass
方法二
function minNumberInRotateArray($rotateArray)
{
if(count($rotateArray)==0){
return 0;
}
$high = count($rotateArray)-1;
$low = 0;
while($low<$high){
if($rotateArray[$low]<$rotateArray[$high]) return $rotateArray[$low];
$mid = (int)($low +($high-$low)/2);
if($rotateArray[$high]<$rotateArray[$mid]){
$low = $mid+1;
}else if($rotateArray[$high]>$rotateArray[$mid]){
$high = $mid;
}else{
$high--;
}
}
return $rotateArray[$low];
}