题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
function minNumberInRotateArray(rotateArray)
{
//方法一:暴力遍历
/*
var res;
var len=rotateArray.length;
if(len==0){
res=0;
}else{
res=rotateArray[0];
for(var i=1;i<len;i++){
if(rotateArray[i]<res){
res=rotateArray[i];
}
}
}
return res;
*/
//方法二:调用Math.min方法
//Math.min 参数里面不支持数组Math.min([param1,param2]);但它支持Math.min(param1,param2,…)
if(rotateArray.length==0){
return 0;
}
return Math.min.apply(null,rotateArray);
//apply第一个参数给了一个null,是因为没有对象去调用这个方法,只需要用这个方法计算得到结果,所以直接传递了一个null过去
//example
/*
function a(xx) {
this.b = xx;
}
var o = {};
a.apply(o, [5]); //a.apply(null, [5]);下面o.b结果就是undefined
alert(a.b); // undefined
alert(o.b); // 5
*/
//方法三:二分查找
if (!rotateArray.length) return 0;
var low = 0;
var high = rotateArray.length - 1;
while (low < high) {
var mid = Math.floor((high + low) / 2); //45123
if (rotateArray[mid] > rotateArray[high]) {
low = mid + 1; //1
} else if (rotateArray[mid] === rotateArray[high]) {
high = high - 1;
} else {
high = mid; //451
}
}
return rotateArray[low];
}
实现方法有上述三种,可以自行选择。第二种方法可以好好理解一下,有助于理解JavaScript函数的调用模式。