把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
读题理解:
在一个非递减排序的数组中,那就是递增的排序数组,把一个数组最开始的若干个元素搬到数组的末尾,这时候会形成以下特殊的形态
如果一路下去出现了非递增序列就停止遍历。
function minNumberInRotateArray(rotateArray)
{
// 给出的所有元素都大于0,若数组大小为0,请返回0。
if(rotateArray.length == 0) return 0;
var n = 0;
while(rotateArray[n] <= rotateArray[n + 1]){
n++;
}
return rotateArray[n + 1];
}
时间复杂度:O(n)
空间复杂度:O(1)
不管三七二十一将数组升序排序,取得第一个元素则是最小数字。
function minNumberInRotateArray(rotateArray)
{
if(rotateArray.length == 0) return 0;
return rotateArray.sort(
function(a,b){
return a-b;
}
)[0];
}
时间复杂度:O(nlogn)
空间复杂度:O(1)
Math.min.apply
JavaScript给我们提供了一个方法,找出数组中最小的数字用Math.min.apply
。
function minNumberInRotateArray(rotateArray)
{
if(rotateArray.length == 0) return 0;
return Math.min.apply(null,rotateArray);
}
在去除后面相同的数据之后,剩下的部分进行二分查找。
function minNumberInRotateArray(rotateArray)
{
var n = rotateArray.length - 1;
if(n < 0) return 0;
// 去除后面相同的数据
while(rotateArray[n] == rotateArray[0] && n > 0) n--;
var l = 0, r = n;
// 二分查找剩下的数列
while(l < r){
var mid = l + r >> 1;
if(rotateArray[mid] < rotateArray[0]) r = mid;
else l = mid + 1;
}
return rotateArray[r];
}
上一篇:05-用两个栈实现队列
下一篇:07-斐波那契数列