题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
示例
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路
采用二分搜索的思路,可以将时间复杂度降低到O(logn)。
首先分别取到数组最左和最右的元素,并在mid位置上取元素,假如array[mid]>array[right],说明mid所在的是原数组的后半部分(边界情况是,mid是数组中最大的数),分界点(最小的数)显然应该在mid和right之间。因此将搜索范围缩小至mid和right之间。
否则,mid和right同处于一个递增序列,此时分界点(最小的数)在left和mid之间(包括mid),因此将搜索范围缩小至left和mid之间。
搜索的终止条件是left与right相邻,这时可以直接对两者使用Math.min()方法求最小值。
Code
function minNumberInRotateArray(rotateArray)
{
// write code here
let left=0,right=rotateArray.length-1;
while(right-left>1){
let mid=left+Math.floor((right-left)/2);
if(rotateArray[mid]>rotateArray[right]){
left=mid;
}else{
right=mid;
}
}
return Math.min(rotateArray[left],rotateArray[right]);
}
运行环境:JavaScript (V8 6.0.0)
运行时间:140ms
占用内存:10228k